人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: disca
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:API Windows ステータス スレッド プログレ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● cx20
●18ポイント

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/controls/progresscontrols/a...

CodeGuru: Progress control with Text

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

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

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

◎質問者からの返答

ありがとうございます。

PostThreadMessageですが、

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

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

配列のポインタを

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

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

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

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

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


2 ● virus
●18ポイント

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

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

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

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

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

◎質問者からの返答

ありがとうございます。

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

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

--

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

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

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


3 ● k318
●18ポイント

http://www.geocities.co.jp/SiliconValley-PaloAlto/2848/

Daughter Mailer

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

◎質問者からの返答

ありがとうございます。

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


4 ● aki73ix
●18ポイント

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自体の表示は残るので、私はこの方法をよく使います。

◎質問者からの返答

WM_SETTEXT ですか!

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ