マルチスレッドでの砂時計カーソル表示

[戻る]
sunyopu 2002/07/22(月) 10:18:07
処理中の砂時計カーソル表示について、質問があります。

開発環境は、Windows2000、VC++6.0です。

プログラムは、マルチスレッドで動作しているのですが、
一方のスレッド(サブスレッド)が仕事中に、
メインスレッドを入力禁止(砂時計表示)にしたいのですが、
それがうまくいきません。

メインスレッドで、
サブスレッドが動作前に、以下をコールし、
AfxGetApp()->BeginWaitCursor();

サブスレッドから終了通知がきたら、
AfxGetApp()->EndWaitCursor();

をコールしています。

単一スレッドのプログラムでは、うまく動作します。

dairygoods 2002/07/22(月) 10:48:35
Windowsはマウスカーソルが移動するたびにWM_SETCURSORを使って
カーソルを更新しています。
メインスレッドが普通にメッセージ処理をしているならば、
常にCWnd::OnSetCursor()が呼び出され、カーソルは元に戻ってしまいます。

次のどちらかの方法で対処できます。

1) OnSetCursor()ハンドラを追加して、
 スレッドが動いているときは、独自のカーソルをセットする。
 (CWnd::OnSetCursor()を呼び出さないようにするだけでいいかも)

2) サブスレッド内でRestoreWaitCursor()をしつこく呼び出す。

sunyopu 2002/07/29(月) 10:20:36
dairygoods いつもありがとうございます。

内部的に、砂時計表示中は、OnSetCursor()内で、RestoreWaitCursor()を
コールすることで、解決できました。

CWnd::OnSetCursor()をコールしないという方法は、うまくいきません
でした。

sunyopu 2002/07/29(月) 10:22:16
申し訳ありません。 さんが抜けてしまいました。
dairygoodsさん いつもありがとうございます。

sunyopu 2002/07/29(月) 10:24:37
[[解決]]
解決しました。

古いスレッドには追加発言できません。