プロが教えるわが家の防犯対策術!

お世話になります、fujicafeと申します。
現在Visual Studio 2005にてVC++のプログラムの作成をしており、
お聞きしたいことがありまして、こちらにて投稿させていただきました。

質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。
現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。
その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか?
スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか?

だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。

A 回答 (3件)

確認いたします


そもそもスレッドをなぜ使いたいのでしょうか?
例えばゲームを作成していて、コンピュータ側の思考に時間がかかってしまう場合に
メインスレッドで処理を行うとユーザーインタフェースの処理を行えないので
サブスレッドでコンピュータの思考処理を走らせるというような必然性があればいいのですが
単純にスレッドを使いたいだと意味がないです(勉強のためとかであれば別ですが)
そのあたりを教えていただけますでしょうか?
    • good
    • 0

インライン回答失礼します。



>では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 …
    • good
    • 0

スレッドとして分けているので、CPUが複数ある場合には


並行して動作するという事が大きな違いかと思います。
完全に並行して動作する為、メモリを共有している場合
排他制御が必要となります。

余談ですが
定期的にPostMessageを呼ぶ場合、時間間隔よりもPostMessageした
処理が長いとキューがオーバフローします。

スレッド化した場合でも、スレッドが終了するよりも早い間隔で
次のスレッドを作成すればどんどんスレッドが増えていきます。
    • good
    • 0
この回答へのお礼

tana_y様ご回答ありがとうございます。

ではCPUが1つしかない場合には、PostMessageで関数を呼び出しても、マルチスレッドで関数を呼び出しても複数の関数の処理が1のCPUを搾取しあうということでしょうか?それともPostMessageで関数を呼び出すというのは、呼び出したその場では関数を呼び出さないだけで、後で、非同期にどこかでその関数が呼び出されるということなのでしょうか?
PostMessageでの関数呼び出しも、マルチスレッドも複数の関数処理を並行に行っているように動作するのかなというイメージをもっていましたので。。

お礼日時:2009/12/11 16:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!