プログレスバーのキャンセルボタン


hide  2011-05-02 00:35:11  No: 72571  IP: 192.*.*.*

環境:Windows7/Visual Studio 2010/MFC

お世話になります。
現在、以下の手段でファイルリードの進捗をプログレスバーに表示しているのですが、追加でキャンセルボタンをつけることになりました。しかし、今はファイルリードが完了するまでキャンセルボタンを押下することができません。ファイルリード中(進捗表示中)にキャンセルボタンを押すにはどうしたらよいでしょうか。どうかよろしくお願いします。

-- 現在の手順
1. メインスレッドの処理開始ボタンのクリックイベントでプログレスバーのダイアログをモーダルで表示

2. プログレスバーのダイアログのInitDialogでワーカースレッドを起動

3. ワーカースレッドは受け取ったウインドウハンドルを使ってPostMessageでプログレスバーのダイアログに状況を通知
--------------

編集 削除
forty-five  2011-05-02 02:55:05  No: 72572  IP: 192.*.*.*

サブスレッドが CPU を占有してるんじゃないですか?
サブスレッドでプログレスバーを更新するときに
::Sleep(1) を挟めばメインスレッドも動くんじゃないかな。

編集 削除
hide  2011-05-02 08:31:06  No: 72573  IP: 192.*.*.*

forty-five様ありがとうございます。

確かにサブスレッドがCPUを占有していてSlepp(1)をワーカ関数内に入れることでボタンを押下することができました。

しかし、ファイルをリードする処理に時間がかかりすぎるようになってしまいました。Sleep(1)を挟まず、かつ時間がかからないようにするには、現在の構造を変える必要があるのでしょうか。またその場合、どのようなかたちにすればよいかご教授していただけないでしょうか。

よろしくお願いします。

編集 削除
maru  2011-05-02 12:30:00  No: 72574  IP: 192.*.*.*

ワーカースレッドの優先度を下げたらどうなりますか?

編集 削除
forty-five  2011-05-02 12:42:54  No: 72575  IP: 192.*.*.*

::Sleep(0) にするとか、
::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_IDLE) を
サブスレッドの最初で呼んでみるとかどうでしょうか。

あとはメインスレッドで
::SetThreadAffinityMask(::GetCurrentThread(), 1) として、
サブスレッドで
::SetThreadAffinityMask(::GetCurrentThread(), 2) とすれば、
マルチコア CPU で効率が良くなるのかもしれないです。

編集 削除
ryo  2011-05-02 13:06:05  No: 72576  IP: 192.*.*.*

情報がすくない

ファイルリードの具体的な内容(サイズ、保存元、バッファの確保方法とか)
ワーカースレッドの管理しかた(終了待ちの仕方とか)
プログレスバーの更新頻度とか(Sleep(1)の回数)

など

編集 削除