こんにちわ。ENDです。
現在、ダイアログベースにて、
以下のような内容のプログラムを作成中です。
1.起動時に、ダイアログ上のOnButton**()を自動実行する
2.OnButton**()で実行された処理の進行状況を、プログレスバーで表示したい。
ちなみに、処理はファイル受信です。
1.に関しては、OnInitDialog()で、OnButton**()を呼び出すことでできていますが、
ダイアログが非表示の状態で実行されてしまいます。
上記のOnButton**()の直前に、
ShowWindow( SW_SHOW )で、windowは表示されるのですが、
ダイアログ上のプログレスバー等は非表示のままです・・・。
自動実行&表示をするには、現在どうしてよいかわからない状態です。
どなたか、情報を頂けないでしょうか?
よろしくお願いします。
環境:VC++6.0 XP
> 1.起動時に、ダイアログ上のOnButton**()を自動実行する
> 2.OnButton**()で実行された処理の進行状況を、プログレスバーで表示したい。
まず、1と2を別々に考えてみてはどうでしょうか?
順番は逆になりますが、次のように、処理を切り分けて、順番に解決するのがよいでしょう。
(1)2.に関して、マウスでボタンが押された際に、プログレスバーを表示できるようにす
る。
(2)上記(1)に関係なく、起動時にOnButton**()を実行できるようにする。
(3)最後に(2)で実行するOnButton**()の内容を(1)のプログレスバーの表示のものに
する。
1.に関しては、OnInitDialog()からはメッセージを投げるだけにし、
OnInitDialog()内ではOnButton**()を直接コールしない方がよいきがします。
#あまり自信がないが・・・
2.に関しては、どのようにプログレスバー等の表示を行なっているかがわからないのですが、
プログレスバー等の表示は、別スレッド化などが必要だと思います。
とりあえず、ENDさんが作成したプログラムを提示してみてはいかがでしょうか?
そのほうが、早く、的確なアドバイスが得られると思います。
> KING・王さん
ありがとうございます。
> とりあえず、ENDさんが作成したプログラムを提示してみてはいかがでしょうか?
> そのほうが、早く、的確なアドバイスが得られると思います。
当初それも考えたのですが、根本の解決にはならないと思いまして・・・。
また、プログレスバーの表示とありますが、それだけではなく、リストビュー等のデー
タも表示させたかったもので・・・。
下記がOnInitDialog()の中の記述です。
*************************************************
BOOL CDesigngetDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//処理省略
if(auto_fg==1){//自動or手動の判別
ShowWindow( SW_SHOW );
UpdateWindow();
OnButton4();//ファイル受信へ
}
return TRUE;
}
*************************************************
現在行っている処理の詳細ですが、
a)ホスト、ファイル名指定
b)「受信開始」ボタン:OnButton4()を押して、aが存在すれば、ファイル受信。
c)受信中は、受信サイズに合わせて、プログレスバーを表示。
ということを行っています。
>当初それも考えたのですが、根本の解決にはならないと思いまして・・・。
>また、プログレスバーの表示とありますが、それだけではなく、リストビュー等の
>データも表示させたかったもので・・・。
この部分の意図があまり良く分からないような。
なぜソースを提示する事と「根本の解決」に関係があるのでしょう。
提示した方がコード上のミスを指摘してもらえるかもしれません。
OnInitDialogの関数を抜けないと実際に画面上には出てこないと思います。
単にダイアログベースの簡単なテストプログラムでOnInitDialog内でMessegeBoxを
出すようなコードを書いてみてはどうでしょう。
MessageBoxが閉じられるまでダイアログは出ないのでは?
と言うことは、OnInitDialogの中でOnButton4を呼び出してしまうと
OnButton4が終了するまでOnInitDialogは表示されないと言うことになってしまいます。
まず表示をさせたいのであれば、KING・王さんが指摘されている通り、
中ではメッセージのポストをするだけにしてOnInitDialog関数は速やかに終わらせるべき
です。
基本的にメッセージハンドラは処理を速やかに終わらせてOSに制御を返す事を期待されて
います。
なので、ウインドウズにおいてはメッセージハンドラ内で長時間滞留するようなプログラムは
組むべきではないとされています。
長時間掛かるような処理を行うのであれば、ワーカースレッド等を使って
メインスレッドが滞留してしまうようなことが無い様に設計する必要があります。
文章がおかしいので訂正。
誤)
>OnButton4が終了するまでOnInitDialogは表示されないと言うことになってしまいます。
正)
OnButton4が終了するまでOnInitDialogも終了しないのでダイアログは表示されないと言
うことになってしまいます。
最近ではあまり聞かなくなりましたが、
Windowsには「0.1秒ルール」なるものがあって
メッセージハンドラは0.1秒以内に処理を完了してOSに制御を戻さねばならない
となっているそうです。
(OS2がで始めた頃は3秒だったような気もする)
調べてみると良いかも知れません。
RATIOさん
返答が遅れてしまいました。すいませんでした。
>この部分の意図があまり良く分からないような。
>なぜソースを提示する事と「根本の解決」に関係があるのでしょう。
>提示した方がコード上のミスを指摘してもらえるかもしれません。
ご指摘の通りです。
今後は、気をつけたいと思います。
>中ではメッセージのポストをするだけにしてOnInitDialog関数は速やかに終わらせるべ
>きです。
メッセージのポストとはどういったことなのでしょうか?
まだまだ、勉強不足です。
なにか、参考になるようなものがあれば、教えて頂けないでしょうか?
よろしくお願いします。
> メッセージのポストとはどういったことなのでしょうか?
メッセージをポストするとそれは一度キューに格納され、順次処理されます。
自分宛にメッセージを送ると、今のハンドラを終わらせたのちに、
順次そのメッセージのハンドラが呼ばれます。
ポストには PostMessage、
MFC のメッセージハンドラは ON_MESSAGE で登録する。
Banさん
PostMessageについて、調べてみました。
その上で、
>メッセージをポストするとそれは一度キューに格納され、順次処理されます。
>自分宛にメッセージを送ると、今のハンドラを終わらせたのちに、
>順次そのメッセージのハンドラが呼ばれます。
の意味や、KING・王さん、PATIOさんの発言の意味が理解できました。
自分の勉強不足です。
また、悩んでいたことは、
OnInitDialog()内で、PostMessage()がOnButton4();を呼ぶように、メッセージを送って
やったら、ダイアログが表示されて、OnButton4();内の処理に流れるようになりまし
た。
今回の件は、非常に未熟さを感じ、勉強になりました。
返信して頂いた方、ありがとうございました。