
お世話になります、fujicafeと申します。
現在Visual Studio 2005にてVC++のプログラムの作成をしており、
お聞きしたいことがありまして、こちらにて投稿させていただきました。
質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。
現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。
その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか?
スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか?
だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
確認いたします
そもそもスレッドをなぜ使いたいのでしょうか?
例えばゲームを作成していて、コンピュータ側の思考に時間がかかってしまう場合に
メインスレッドで処理を行うとユーザーインタフェースの処理を行えないので
サブスレッドでコンピュータの思考処理を走らせるというような必然性があればいいのですが
単純にスレッドを使いたいだと意味がないです(勉強のためとかであれば別ですが)
そのあたりを教えていただけますでしょうか?
No.2
- 回答日時:
インライン回答失礼します。
>ではCPUが1つしかない場合には、PostMessageで関数を呼び出しても、マルチスレッドで関数を呼び出しても複数の関数の処理が1のCPUを搾取しあうということでしょうか?
その通りです。
>それともPostMessageで関数を呼び出すというのは、呼び出したその場では関数を呼び出さないだけで、後で、非同期にどこかでその関数が呼び出されるということなのでしょうか?
その通りです。
WindowsはマルチタスクのOSなので、例えCPUが一つしかなかったとしても、タイムスライスという方式でなんちゃって並行処理を行っています。
>PostMessageでの関数呼び出しも、マルチスレッドも複数の関数処理を並行に行っているように動作するのかなというイメージをもっていましたので。。
そのイメージであっております。
一つのCPUでもマルチタスクでなんちゃってで並行動作しますが、複数のCPUが存在する場合には、スレッドが分かれている方は
本当の意味で並行動作します。
PostMessageの方は複数CPUでも、一つのCPUしか使われないと思います。
※この部分だけは断言できません。マイクロソフトが頑張っているかもしれない。
でもPostThreadMessageなんて関数があるのだからPostMessageは
スレッドのようには動かないかなと予想しています。
参考URL:http://msdn.microsoft.com/ja-jp/library/cc410979 …
No.1
- 回答日時:
スレッドとして分けているので、CPUが複数ある場合には
並行して動作するという事が大きな違いかと思います。
完全に並行して動作する為、メモリを共有している場合
排他制御が必要となります。
余談ですが
定期的にPostMessageを呼ぶ場合、時間間隔よりもPostMessageした
処理が長いとキューがオーバフローします。
スレッド化した場合でも、スレッドが終了するよりも早い間隔で
次のスレッドを作成すればどんどんスレッドが増えていきます。
tana_y様ご回答ありがとうございます。
ではCPUが1つしかない場合には、PostMessageで関数を呼び出しても、マルチスレッドで関数を呼び出しても複数の関数の処理が1のCPUを搾取しあうということでしょうか?それともPostMessageで関数を呼び出すというのは、呼び出したその場では関数を呼び出さないだけで、後で、非同期にどこかでその関数が呼び出されるということなのでしょうか?
PostMessageでの関数呼び出しも、マルチスレッドも複数の関数処理を並行に行っているように動作するのかなというイメージをもっていましたので。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- その他(Microsoft Office) エクセルの関数について 4 2022/07/30 16:42
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語のwhileを含む関数について 2 2022/12/16 12:28
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
このQ&Aを見た人はこんなQ&Aも見ています
-
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
スレッドの終了の仕方
C言語・C++・C#
-
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
PostMessageの連続送信
C言語・C++・C#
-
6
マルチスレッド間でデータ交換をする方法
C言語・C++・C#
-
7
(マルチスレッド)_beginthreadexに複数の引数を渡す
C言語・C++・C#
-
8
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
9
INT64対応のprintf系関数はありますか?
C言語・C++・C#
-
10
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
11
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
12
CString から LPCTSTRの型に変換
C言語・C++・C#
-
13
非同期のプロセス間通信(パイプ)で全データ受信する
C言語・C++・C#
-
14
ハンドルはポインタか
C言語・C++・C#
-
15
テキストボックスからフォーカス外す
C言語・C++・C#
-
16
WaitForSingleObjectの使い方について
C言語・C++・C#
-
17
ConnectNamedPipeの接続待ち
C言語・C++・C#
-
18
マルチスレッドプログラミングについて
C言語・C++・C#
-
19
エディットボックスで改行
その他(プログラミング・Web制作)
-
20
ダイアログをスクロールさせるには
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの監視方法について
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
スレッドを効率的に使うとは?
-
.netアプリへのSendMessageでフ...
-
Windows上で、シグナル(SIGTERM...
-
Linuxでスレッド優先度って変え...
-
複数スレッドを動作させるのに...
-
VC++スレッドの正しい終了のさ...
-
スレッドの安全な終了のさせ方
-
Macターミナルで実行中のプログ...
-
C言語で、メモリを解放しないで...
-
SendMessageが失敗するときがある
-
レジスタマップって何ですか?
-
VBSの処理中一旦処理を止めて再...
-
グラフィックLCD SG12...
-
C# シリアル通信でデータ受信...
-
メッセージボックスのボタン名変更
-
分を時間に変換するプログラム
-
ウイルスは必ずタスマネのプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
スレッドの終了の仕方
-
VB2005 シリアル通信のClose処理
-
WaitForSingleObjectの使い方に...
-
別スレッドのデータを受信できない
-
同一スレッドで、ロックをかけ...
-
CWnd::OnTimerのスレッドの取得
-
スレッドの安全な終了のさせ方
-
メインダイアログが最背面に表...
-
スレッド一覧の取得
-
Windows上で、シグナル(SIGTERM...
-
C言語で一定時間待機後、再実行
-
C#でスレッド実行中のイベント...
-
複数スレッドを動作させるのに...
-
.netアプリへのSendMessageでフ...
-
DirectX LPDIRECT3DDEVICE9のマ...
-
スレッド内でコントロールやWin...
-
DirectX 11のConsntanBuffer
おすすめ情報