No.2ベストアンサー
- 回答日時:
ワーカースレッド(以下WS)でもユーザーインターフェイススレッド(以下UI)でも
スレッドはスレッドでMSが便宜上分けているだけということは覚えておいたほうが
いいです。
で、本題ですが、両者の最大の違いはメッセージポンプがあるかないかです。
メッセージポンプなしがWSで、ありがUIです。ですから、作成したスレッド内で
Windowsメッセージを処理しなければならないような場合、例えばセカンダリスレッドで
ウィンドウを作成して、時刻を表示するとか、ユーザの入力を受け付けて何らかの
処理を施すとかはUIを使います。
そうではなく、アプリがある種のサーバで、クライアントからの要求に対してデータを返却
するだけの処理のような場合はWSで行います。(まあ、クライアントからの要求に対して
いちいちWSを作るか、WaitForSingleObjectなどの待機関数で無限ループにするかなど実装
はいろいろありますが)
荒っぽい書き方をすると、Windowsのようなオブジェクト指向はUIで、旧来の
コンソールアプリのような手続き型はWSだともいえます。
最初にWSとUIは便宜上分けただけといいましたが、それはどちらもスレッドの制御関数は
同じで、スレッド作成時(AfxBeginThread)の引数で条件分岐しているだけなのがその理由です。
ですから、スレッドの制御関数を調べてみるとその違いがよくわかるので、以下のソースコードを
よくみてみてください。
thrdcore.cpp内のUINT APIENTRY _AfxThreadEntry(void* pParam)が制御関数で、どちらのスレッドを
使うにしてもこの関数がスレッドの制御関数として実行されるので中身をよく吟味してください。
No.1
- 回答日時:
すいません、例を書いていたら長くなりました…。
あくまで私はこう使っている、という内容ですが…UIスレッドは、ウィンドウ制御(初期化、描画、ボタンやタイマー等のイベント)を処理するスレッド、
ワーカースレッドはウィンドウ制御と関係無く処理をさせるスレッド、と認識しています。
簡単に言うと、長時間処理をしなければならない場合や、イベントを途中で拾わないと処理できないものはワーカースレッドを生成し、通常はUIスレッドで処理をさせると考えると良いかもしれません。
(本当にいいかは判りませんが・・・)
どんな時に使うかは、こんな感じです。
私は良くダイアログウィンドウでアプリを作るのですが、長時間処理がかかるものも実装することがあります。
この長くかかる処理を、たとえばマウスの左ボタン押下(OnLButtonDown)に実装したとします。すると、ボタンを押した後、処理が終了するまで画面の再描画が行われず、ウィンドウの移動を操作してもウィンドウは動きません。(処理している最中に他アプリのウィンドウが自分のアプリより前に来て、また自分のアプリをクリックされると、再描画が行われる・・・はずですが、再描画できない、という感じです。たまにこんなアプリ見かけませんか?)
これは、UIスレッドが通知されたイベントを拾ってマウス左押下処理を呼び出して、その処理から戻ってこないためで、再描画イベント(WM_PAINTメッセージ)や移動イベント(WM_MOVE)が処理できず、処理待ちとして溜まっている(待たされている)からです。
短い処理であれば、大して問題にはならないのですが、1分2分、1時間と続くと、さすがにアプリの使用者はバグった!と思うかもしれません。
また、最悪はWindowsが無応答としてタイトルバーに(無応答)をつけてしまいます。
こんな風に、処理が長くなるケースの場合、左ボタン押下処理にはワーカースレッドの生成処理を記述してワーカースレッドを起動し、ワーカースレッドでやらせいたい処理を行わせます。すると、UIスレッドは次のイベントを処理できる様になりますので、再描画もできますし、ウィンドウの移動もできます。
ただし、他のボタンを押したりすることもできるので、その辺りは、フラグで処理できない様にするか、ボタン等のコントロールをDisableにして、クリックできない様にしたりします。
結構前ですが、ユーザーがソフトに指示を与えてどの位待てるか、という調査があったのですが、大体2~3秒ということでした。(現在もこうなのかわかりません)
これをすぎると、ユーザーは何かしらの操作を行ったり、異常だと思うんだそうです。
私は、ワーカースレッドにする1つの判断材料として、処理時間が2~3秒かかるか否かで判断しています。
他の要因でワーカースレッドに出来なかったりすることもありますが、この時間を越えるならば、大抵はワーカースレッドで処理させています。
処理が長くなるなら、進捗をプログレスバー等で示すことも必要となります。
(動いているかどうかユーザーに教えると言うことですね)
そんな時も、ワーカースレッドにしておくと、プログレスバーの描画等も問題無く動きます。
実際の実装例や具体的な時間など
丁寧に教えていただき有難うございました。
また、これからマルチスレッドプログラミングを始める物として
本当に良い勉強になりました。
貴重な情報有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- プリンタ・スキャナー Brother MFC-7460DNの一時停止解除について 1 2022/12/03 12:38
- CPU・メモリ・マザーボード インテルCPUの世代ごとのデスクトップとノートのコア数についてこれで正しいですか?(*´ω`*) 1 2023/01/07 14:44
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
- 固定IP Latexの初期Fontに関する質問です。 1 2023/05/23 19:17
- BTOパソコン PCの選び方 6 2022/09/11 00:16
- 統計学 統計学の問題です。どうか教えてください。 線形回帰モデルYi=β0+β1xi+ui(i=1,2,.. 5 2023/06/16 00:51
- CPU・メモリ・マザーボード CPUについて 4 2022/07/09 13:41
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFC通信プログラムマルチスレッドで例外スロー
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
-
4
CString から LPCTSTRの型に変換
C言語・C++・C#
-
5
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
6
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
7
CStringをwchar_tに変換したい
C言語・C++・C#
-
8
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
9
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
10
MFCでハンドルを取得するには
C言語・C++・C#
-
11
AfxBeginThread の引数について
C言語・C++・C#
-
12
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
13
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
14
ヒープメモリの解放について
C言語・C++・C#
-
15
deleteで開放するとエラーになる原因がわからない
C言語・C++・C#
-
16
ラジオボタンの値の取得について(C++)
C言語・C++・C#
-
17
CImageクラスの使用について
C言語・C++・C#
-
18
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
19
COMPORTマルチスレッドで例外発生
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「キャンセル」ボタン付きの処...
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
VBA、UserFormを前面に出力して...
-
ACCESS側からEXCELの書式を設定...
-
ASP VBScriptでスクリプト実行...
-
DirectX環境下での方向キー同時...
-
ASP.NETでのメッセージ画面を出...
-
PostMessageの連続送信
-
Androidアプリで本体の音量変更...
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
beforecloseの中からの抜け出し方
-
手動かプログラムでの起動かの判断
-
winsock2 非同期処理について
-
ファンクションキーのキャンセ...
-
ボタンが押された事を検知する...
-
SendMessage中のメッセージ・ル...
-
VB6 コマンドボタン クリック...
-
DoEvents
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
VBA、UserFormを前面に出力して...
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
エクセルVBAでクリップボード内...
-
Application.ScreenUpdating=Fa...
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA で処理中断(DoEvents...
-
【MFC】イベントの無効化について
-
【C#】 あるイベントから別イ...
-
MFCのワーカースレッドとUIスレ...
-
Excel VBA 自動的に閉じるMsgBox
-
VCでウエイトをミリ秒でかけ...
-
[VC++] AfxBeginThreadで生成し...
-
DoEvents
-
InvalidateRectがうまくいかない
-
「キャンセル」ボタン付きの処...
おすすめ情報