環境:Windows7/Visual Studio 2010/MFC
お世話になります。
現在、以下の手段でファイルリードの進捗をプログレスバーに表示しているのですが、追加でキャンセルボタンをつけることになりました。しかし、今はファイルリードが完了するまでキャンセルボタンを押下することができません。ファイルリード中(進捗表示中)にキャンセルボタンを押すにはどうしたらよいでしょうか。どうかよろしくお願いします。
-- 現在の手順
1. メインスレッドの処理開始ボタンのクリックイベントでプログレスバーのダイアログをモーダルで表示
2. プログレスバーのダイアログのInitDialogでワーカースレッドを起動
3. ワーカースレッドは受け取ったウインドウハンドルを使ってPostMessageでプログレスバーのダイアログに状況を通知
--------------
サブスレッドが CPU を占有してるんじゃないですか?
サブスレッドでプログレスバーを更新するときに
::Sleep(1) を挟めばメインスレッドも動くんじゃないかな。
forty-five様ありがとうございます。
確かにサブスレッドがCPUを占有していてSlepp(1)をワーカ関数内に入れることでボタンを押下することができました。
しかし、ファイルをリードする処理に時間がかかりすぎるようになってしまいました。Sleep(1)を挟まず、かつ時間がかからないようにするには、現在の構造を変える必要があるのでしょうか。またその場合、どのようなかたちにすればよいかご教授していただけないでしょうか。
よろしくお願いします。
ワーカースレッドの優先度を下げたらどうなりますか?
::Sleep(0) にするとか、
::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_IDLE) を
サブスレッドの最初で呼んでみるとかどうでしょうか。
あとはメインスレッドで
::SetThreadAffinityMask(::GetCurrentThread(), 1) として、
サブスレッドで
::SetThreadAffinityMask(::GetCurrentThread(), 2) とすれば、
マルチコア CPU で効率が良くなるのかもしれないです。
情報がすくない
ファイルリードの具体的な内容(サイズ、保存元、バッファの確保方法とか)
ワーカースレッドの管理しかた(終了待ちの仕方とか)
プログレスバーの更新頻度とか(Sleep(1)の回数)
など
ツイート | ![]() |