2011-07-04 9 views
1

私はしばらく前にC++を学び始めました。私はVisual Studio 2010でたくさんのコンソールプログラムを作ったので、今はwin32プログラムを作りたいと思っています。私は多くのチュートリアルを読んで、私は今基礎を理解しています。「インタラクティブ」C++の睡眠

別の機能を呼び出すボタンを作った。この機能はすばらしいことをすべて実行しています。しかし、この機能ではスリープ(x)があり、スリープが終了しない間はGUIが応答しません。この機能は60秒で実行されます。なぜなら、そこにはたくさんのスリープがあるからです。それはGUIが今度は応答していないことだけです。

私はこの問題の原因を知っていると思います。私の意見では、問題はSleepが完全にアプリケーションを一時停止することです(Windowsは応答しません)。

GUIをフリーズさせないスリープ/ポーズを行うにはどうすればよいですか?機能がありますか、まったく違う方法でそれをしなければなりませんか?

ありがとうございます!

+0

スリープコールは本当に必要ですか?あなたの機能は本当に「何もしません**一定の時間は?」する必要がありますか?もしそうなら、理由を教えてください。それは確かにあなたがより良い答えを得るのを助けるでしょう。 –

+0

なぜあなたはなぜよく眠るのですか? – Xeo

+3

関数が何らかの定期的な処理を行う場合は、WM_TIMERメッセージの使用を検討してください。 –

答えて

4

問題は睡眠が完全にアプリケーション

はいを​​一時停止しています。

GUIをフリーズしないスリープ/ポーズを行うにはどうすればよいですか?

なぜ最初に寝る必要がありますか?関数が誤動作している場合は、バックグラウンドスレッドで常に実行できます(しかし、これはかなり複雑で難しいことに注意してください)。通常、あなたはまったく眠る必要はありません。眠らなければならない場合は、十分な時間が経過するまでループして、OSからのイベントを処理し、タイムスライスを生成するSleep(0)を呼び出します。

+0

OPはWin32の新機能なので、 'Sleep'はアプリケーションを一時停止せず、呼び出されたスレッドに言及する価値があります。上記の場合、事実上同じですが、アドバイスを受けて別のスレッドを使用する場合は、「スリープ」によって1つだけ一時停止されます。 – eran

+0

@eran:私は少し眠そうですので、自由に編集して明確にしてください。 –

+0

私は参照してください。ですから、私がしなければならないことは、メインスレッド(GUI)が動作し、バックグラウンドがスリープできる間にバックグラウンドスレッドでこれらのコードを実行することです。または私はそれが悪いと理解していますか? ええ、それは難しいですが、私は現在、これを行う最も簡単な方法を探しています。 – Gaboros

0

別のスレッド(CreateThreadを参照)に作業をオフロードするか、PeekMessage以降を使用してください。ウィンドウのメッセージを処理してGUIを生き生きとした状態に保つために、タイトなループで実行します。

もちろん、あなたは本当に眠る必要があるかどうか自問する必要があります。あなたが言ったように、メインスレッド(メッセージポンプをポーリングするスレッド)でスリープすると、GUI処理ができなくなります。私の意見で

0

スレッドを使用する必要があります。 GUIで長時間実行されるプロセスがある場合は、スレッドを作成して、すべてのコード(この場合は多くのスリープ命令が含まれています)を処理する必要があります。スレッドが完了すると、通知され、そこからデータを抽出できます。