2016-05-25 6 views
0

私はVisual Studio for C++、Windowsフォームアプリケーションで作業します。私はボタンを赤く塗りつぶし、3秒待ってから青く塗ります。C++関数Sleep()はコードの前に実行します

button1->BackColor = System::Drawing::Color::DarkRed; 
Sleep(3000); 
button1->BackColor = System::Drawing::Color::CornflowerBlue; 

しかし、Sleep()関数は最初の行の前に実行されます(赤く塗りつぶします)。プログラムは3秒待ってから始まり、時間の経過後に青色のボタンを塗ります。コードの赤い部分を描くのに時間がないようです。個別に、赤い絵画はうまく動作します。 私は他の遅延ソリューションも試しました。例:スリープ()関数は、コード::ブロックのコンソールスクリプトに完璧に働いているので、

int wait = clock() + 2 * CLOCKS_PER_SEC; 
while (clock() < wait) {} 

Visual StudioのC++での問題のようです。解決策はありますか?

+0

メインスレッドをスリープ状態にして、バックグラウンドカラーを赤に更新する時間がないと仮定しています。 –

+0

スリープ機能は、一定期間プログラムの実行を停止します。あなたの場合、ドローコールの前に起こります。 draw呼び出しごとに実行される更新関数を使用する必要があります – Striker

+0

ボタンは強制的に再描画する必要があります。デフォルトではパフォーマンス上の理由から即座にボタンを実行せず、 'Sleep()'を呼び出すとその前にスレッドを中断します起こる.NETを使用している場合 - 明確にしていない - 'Sleep()'の呼び出しの前に 'button1-> Refresh()'を追加してみてください。 – Peter

答えて

0

'button1-> BackColor = System :: Drawing :: Color :: DarkRed;'などのコンポーネントプロパティを設定します。簡単な割り当てではありません。 setterメソッドは、GUIを実装するWindows /スレッドにポストされるメッセージまたは一連のメッセージを生成します。これらのメッセージは、要求されたプロパティセットアクションが完了したとみなす前に処理する必要があります。

イベントハンドラでウィンドウのビジュアルプロパティを設定し、イベントハンドラを離れる前にウィンドウを管理するスレッドからすべての実行を削除すると、メッセージは処理されません。

GUIイベントハンドラで待機しないでください。メッセージを処理するための状態機械です。それをやめないでください。

0

あなたの貢献者に感謝します! スレッドに関するアドバイスが役に立ちました。私はこの問題をRefresh()関数で解決しました。コードの一部は、非同期で動作する別のスレッドで処理されるようです。 Refresh()関数はおそらく、スレッドの同期待ちを実装します。

関連する問題