• 締切済み

VC++ 2008

VC++2008(Express Edition)であるボタンを押したときの動作についてですが private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { richTextBox1->Text = "測定開始\n"; func(); // ある測定の関数です richTextBox1->Text += "測定終了"; } 上記のようなプログラムが実行されたとき、button1_Click()を抜けるまでテキストボックスに 測定開始 測定終了 の表示がされませんが何故でしょう? func()自体の処理に1分程かかるため、ボタンを押してから1分程経たないとテキストボックスには何も表示されない状態です。 リアルタイムで表示することは可能でしょうか?

みんなの回答

回答No.1

> の表示がされませんが何故でしょう? メッセージループが実行されていないからです。 > リアルタイムで表示することは可能でしょうか? 何をもってリアルタイムとするかは議論が分かれそうですが……。 今回の問題であれば,通常はマルチスレッドの出番です。 手っ取り早くすますのであれば, ・FormにBackgroundWorkerを貼り付ける ・button1_Clickに,"測定開始"の設定と,button1の再入禁止設定,貼り付けたBackgroundWorkerのRunWorkerAsyncメソッドの呼び出しコードを書く ・BackgroundWorkerのDoWorkイベントのハンドラにfuncの呼び出しを書く ・BackgroundWorkerのRunWorkerCompetedイベントのハンドラに"測定終了"の追記コードとbutton1の再有効化コードを書く とすれば,DoWorkの中だけ別スレッドで走ってくれます。 # DoWorkの中からコントロールを扱わないように注意する事くらいか。 MSDN: BackgroundWorker クラス (System.ComponentModel) http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker.aspx MSDN: BackgroundWorker コンポーネント http://msdn.microsoft.com/ja-jp/library/c8dcext2.aspx Blog: とあるコンサルタントのつぶやき : Part 4. Visual Studio によるマルチスレッドアプリの開発 http://blogs.msdn.com/nakama/archive/2009/04/09/part-4-visual-studio.aspx

h_uta
質問者

お礼

ありがとう御座います。 結構前から悩んでいたことなので助かりました

すると、全ての回答が全文表示されます。

関連するQ&A