スレッドセーフによる重い処理に対してのステータス状況(XX%完了など)をプログレス表示させる方法。(Windows API SafeArray, Event, Mutex, CriticalSection, GloballLock)具体例歓迎、よろしくおねがいいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/06/30 12:04:29
  • 終了:--

回答(4件)

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082004/06/30 12:27:08

ポイント18pt

http://homepage2.nifty.com/DSS/VCPP/MFC/Dialog/dlgappprgbar.htm

ダイアログアプリにプログレスバー

プログレスバーダイアログの作成方法についての説明があります。

MFC用ですが参考まで。

http://www.codeguru.com/Cpp/W-D/dislog/progressindicators/articl...

CodeGuru: Modeless Multi-Threaded Progress Dialog

プログレスバーダイアログのサンプルです。

プログレスインジケーターに文字列(%など)を載せる方法です。

http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/

CodeGuru: Embed Progress Bars in a List Control

リストビューにプログレスバーを貼り付ける方法です。

http://www.codeguru.com/Cpp/controls/statusbar/article.php/c2991...

CodeGuru: Showing progress bar in a status bar pane

ステータスバーにプログレスを貼り付ける方法です。

id:disca

ありがとうございます。

PostThreadMessageですが、

(WPARAM, LPARAM)に渡せるデータ量がが決まってますね。またメッセージキューは最大で10000となっていたはずです。(キューがあふれる可能性あり。)

データ量について言うならば、

配列のポインタを

渡せば良いのかも知れませんが、

Thread-Safe系ではポインタは渡せません。

(SafeArrayを使えば別ですが)。

そこで、メモリハンドル(もちろんロックをかけて)を渡せば良いと考え勝ちですが、

しかし重い処理にはお勧めできません。難しいものです。

2004/06/30 13:03:46
id:virus No.2

virus回答回数183ベストアンサー獲得回数12004/06/30 13:16:14

ポイント18pt

http://www.hatena.ne.jp/1088564669

スレッドセーフによる重い処理に対してのステータス状況(XX%完了など)をプログレス表示させる方法。(Windows API SafeArray, Event, Mutex, CriticalSection, GloballLo.. - 人力検索はてな

具体例ではないのでポイント不要です。

データ量云々ですが、必要最小限のデータ(%表示だけで良いのなら%値のみ)だけ渡せばいいのでは?

プログレスダイアログは別スレッドにすれば、本体の処理が重くても確実に表示は更新出来ますね。問題の要点がわからないのですが・・・

id:disca

ありがとうございます。

なるほど。具体的には、ファイル圧縮等に使用すると想定していただければ幸いです。

あと、プログレスに渡す場合ですが、min値 pos値 max値を渡しています。(ファイルデータの読み込み量(*** Byte))

--

プログレス表示部だけ、別スレッドにすることですが参考になります。

しかし他スレッドから、プログレスウインドウスレッドを直接操作、例えばプログレスの値を渡す

場合は、スレッド境界を超えてしまいます。

2004/06/30 14:02:27
id:k318 No.3

k318回答回数2622ベストアンサー獲得回数22004/06/30 21:48:11

ポイント18pt

複数のリストの読み込みをスレッドセーフで行うと普通にシングルスレッドで行うのとあまり変わらないということに気づいてしまいました。メールリストをバッファへ一気にため込むのではなく、必要に応じてファイルからロードしているため、 1回1回の読み込みに多少のオーバーヘッドはかかりますが、全体的なパフォーマンスは上がっている。受信時ダイアログボックスには、プログレスバーの表示があるとのことです。コードもあります。

id:disca

ありがとうございます。

すこし参考になりました。

2004/07/01 18:42:51
id:aki73ix No.4

aki73ix回答回数5224ベストアンサー獲得回数272004/07/06 10:45:50

ポイント18pt

http://www.ne.jp/asahi/hishidama/home/tech/vcpp/caption.html

VC++「キャプション(タイトル)の変え方」メモ(Hishidama's VC++Memo "Caption")

重い処理をプログレス表示する時はアプリケーションスレッドが管理していないOS側で管理しているApplication Captionを利用してはいかがでしょうか?

wsprintf(str1,"%d%%完了",prg/*進捗*/);

SetWindowText(hwnd/*アプリケーションハンドル*/,str1);

Messageキューが溜まってアプリケーション自体が停止してしまってもWindow Caption自体の表示は残るので、私はこの方法をよく使います。

id:disca

WM_SETTEXT ですか!

とても興味深いです。標準ウインドウメッセージをSend or Postすることで、ある程度の高速化が期待できそうです。

2004/07/06 11:26:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません