• 締切済み

メッセージループについて

確認したいのですが、AとBのプロセスがあるとしたら、 AとB while(GetMessage(&msg,NULL,0,0,PM_REMODE)) { TranslateMessage(&msg); DispatchMessage(&msg); } でAを実行中のときはBのプロセスはGetMessageによって処理を行わず待機、Bに移った場合、AはGetMessageによって待機というのでいいのでしょうか?

  • 79562
  • お礼率68% (164/239)

みんなの回答

回答No.1

別プロセスであれば,AとBは互いに独立して動きます。 Aを実行中でもBのメッセージキューにメッセージが入れば,Bもメッセージループも実行されます。 もちろん,仮想的なプロセッサの個数が1個であれば,同時に複数のコードがスレッドが実行されることはありませんが, それでもコンテキストスイッチは,GetMessageの呼び出しと直接関係せずに起こります。 # DispatchMessageから呼ばれている最中でもコンテキストスイッチは起こるということ。

79562
質問者

お礼

この文を読んでまだまだ勉強不足ということがわかりました。出直します。回答ありがとうございました。

関連するQ&A

  • メッセージループについて

    while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } else { } これはpeekMessageがメッセージを取り出してメッセージがあったら if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) を実行して、GetMessage()で待機してもし、メッセージがWM_QUITならGetMessageにWM_QUITのメッセージを渡してメッセージが消えてPeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか? あと、while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { } if(msg.message==WM_QUIT) break; DispatchMessage(&msg); } else { } if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか?ご教授お願いします。

  • APIのメッセージループの流れとTranslateMessage

    while(GetMessage(&msg, NULL, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } もしも「a」が押されたときは、 GetMessageで受け取って TranslateMessageでWM_CHARに変換され DispatchMessageでWM_CHARとしてのメッセージが送られる という流れになるはずです。 けど、実際には一度プロシージャにWM_KEYDOWNが送られます。 TranslateMessageが先にメッセージを変換してるので、WM_KEYDOWNが送られることはありえないと思うのですが、なぜでしょうか。 何か重大な思い違いをしているのでしょうか・・?

  • メッセージループ

    while(true) { if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { return (int)msg.wParam; } } } else { } このソースで実行して消したら終了しませんでした。 なぜ終了できなかったのでしょうか?

  • PeekMessageについて

    確認したいのですが、 MSG msg; while(TRUE) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) { return (int) msg.wParam; } TranslateMessage(&msg); DispatchMessage(&msg); } else { } } このPeekMessageというものですがキューに溜めているということでいいのでしょうか。 後、 MSG msg; while(TRUE) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { return (int) msg.wParam; } if(msg.message==WM_QUIT) { return (int) msg.wParam; } TranslateMessage(&msg); DispatchMessage(&msg); } else { } } の if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { return (int) msg.wParam; } はキューから出してGetMessageは待機してるということでいいのでしょか? if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { return (int) msg.wParam; } これはキューの中は出さないで、GetMessageでPeekMessageからのキューを出しているということでいいのでしょか?

  • Windowsプログラムでのメッセージループ

    Microsoft Visual C++6.0でWin32ApplicationでWindowsプログラムを作る勉強を始めました。 『Visual C++ 1 はじめてのWindowsプログラミング』(山本信雄 著) という本で勉強しています。 WinMain函數の中に次のような「メッセージループ」というものがあるんですね。 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 本の説明では 「メッセージループとは、GetMessageでメッセージの有無を常に確認しつづけるループです。Windowsプログラムは、何もしていないように見えるときでも常にメッセージループをじっこうしているのです。」 ということです。 また 「もしもメッセージがなければ、GetMessageは他のアプリケーションに処理を讓ります。これによってWindowsのマルチタスクがじつげんされています。」 ともありました。 私が思ったのは、 他のアプリケーションに処理を讓ってしまったら、上の説明にあるような「常にメッセージループをじっこうしている」ことにはならないんではないか、 ということです。 逆に、メッセージがあり續けたら、他のアプリケーションに処理を讓らないのでしょうか。 WindowsのマルチタスクはGetMessageが行っているのではなくて、WindowsというOSが行っているのではないでしょうか。 GetMessageが他のアプリケーションに処理を讓っている間の状態というのは、GetMessage函數がじっこうされている状態なのでしょうか。それとも、その間プログラムは停止しているのでしょうか。停止しているのだとしたら、再開するのはGetMessageの次のTranslateMessageからでしょうか。 編集部に質問を送ったのですが、返事はありません。 初級者ゆえ何か勘違いしているのかもしれません。 よろしくお願いいたします。

  • C++ GUIのメッセージループ。

    初心者です。 よろしくお願いします。 とても重く時間の掛かる処理を色んなサイトを参考にスレッドにしてみたんですけど、書き方が悪いのか、再描写がワンテンポ遅れたり、アプリケーションを複数起動したりするとフリーズしてしまったりします。 原因はメッセージループにあるような気がしてるんですが、この書き方はおかしいですか?? どのサイトから引用したのかわからなくなってしまいました。 気付いたことなどあったら何でもいいので教えて貰えたら嬉しいです!よろしくお願いします!! thread01に重い処理が書かれてます。 int thread_call() {   unsigned int dwThreadId[1];   HANDLE hThread[0] = (HANDLE)_beginthreadex(     NULL,     0,     ( unsigned int (__stdcall*)(void*) )thread01,     NULL,     0,     &dwThreadId[0] );   MSG msg;   DWORD dwRet = WAIT_TIMEOUT;   while ( 1 ) {     dwRet = ::MsgWaitForMultipleObjects( sL, hThread, FALSE, INFINITE, QS_ALLEVENTS );     if ( dwRet == WAIT_OBJECT_0 + sL ) {       if ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {         ::TranslateMessage( &msg );         ::DispatchMessage( &msg );       }     } else if ( dwRet >= WAIT_OBJECT_0 && dwRet < WAIT_OBJECT_0 + sL )       break;   }   CloseHandle( hThread[0] );   hThread[0] = NULL; }

  • Sleep(1)が1msでもどってこない。

    Sleep(1)が1msでもどってこない。 ゲームのループ処理を作っていまして、 空いている時間をシステムに返すためにSleep(1)を呼んで いるのですが、 while( msg.message != WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { //ゲーム的な処理 //時間があまればSleep() } } といった定番なことをしているのですが、 30FPSで固定されません。 調べてみるとSleep(1)が2msくらいして戻ってきています。 なにかよいアイディアを持っている方がいらっしゃいましたら教えてください。 よろしくお願いします。

  • WaitForSingleObjectの使い方について

    こんにちは。 WaitForSingleObjectを使って、スレッドがシグナル状態になるまで待機するために、以下のようにコーディングしました。 WaitForSingleObject( threadHandle, INFINITE ); ところが上記だと、スレッドが正常にシグナル状態にならなかった場合に、永遠に待ち続けフリーズしてしまう可能性があること以下のサイトで知りました。 http://hitokuso.kicks-ass.org/progtips.html#1 while( ::WaitForSingleObject( threadHandle, 50 ) == WAIT_TIMEOUT ) { MSG msg; ::GetMessage( &msg, NULL, 0, 0 ); if( !IsDialogMessage( &msg ) ) // ダイアログ内の場合 { ::TranslateMessage( &msg ); ::DispatchMessage( &msg ); } } 上記のようにwhileループで回し、タイムアウトだったらメッセージを処理しているようなのですが、タイムアウト時間として50ミリ秒を指定しているので、一瞬だけ待ってすぐにメッセージ処理を継続しているような気がします。これでは、スレッドがシグナル状態になるまで待たないような気がするのですが… まだまだ知識不足のため、見当違いな疑問を持っているのかもしれませんが、どなたかアドバイス・ご教授をお願いいたします。

  • WinMain関数が呼ばれません

    CTestDialogクラスより、CTest2Dialogクラスのダイアログを、 MDIで呼び出すプログラムを作成したいのですが、 まずフレームウィンドウを作成しようと思い、 CTestDialogクラス内に下記のような雛形を作成しました。 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow){ MSG msg; while ( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam; } ビルドしてみると、通るのですが、 中にデバッグポイントを打って実行してみても、 どうやら中に入っていないようです。 WinMain関数が正しく動いていれば、プログラム実行時に 自動で呼び出される認識なのですが。。 何か定義が間違っているのでしょうか? 解決策についてご存知の方おられましたら、 お手数ですがご教授お願い致します。 開発環境はVC++2005です。

  • Win32 メッセージループ

    ウィンドウズプログラミングを勉強はじめたばかりなのですが、2つ質問があります。教えてもらえると助かります。 まず、GetMessage関数の第2引数です。 これはメッセージを取得するウィンドウハンドルを指定とありました。NULLを使えばそのスレッドのすべてのメッセージを取得することになると思いますが、NULL以外で実際にウィンドウハンドルを指定するプログラムは一体どういうときなのか知りたいです。 試しにCreateWindow関数でウィンドウを2つ作りをメッセージを取得したいウィンドウハンドルを指定したところ指定しなかった方はメッセージを取得しませんでした、もちろん想定どおりです。しかし、メッセージの取得するウィンドウでサイズなど変更できない場合がありました(取得しないウィンドウをクリックした直後など)これはメッセージキューのメッセージ処理によるものだと(自分の考えなのであってるか不明)思います。結局NULL以外使い道ないんじゃないかとと思ってしまいました。 もう一つの質問です。 ウィンドウプロシージャはコールバック関数であるのでしょうか?システムから呼ばなくてはいけない理由が知りたいです。 これも自分の勝手なよそうですが、DispatchMessage関数が送るメッセージをシステムがどのウィンドウプロシージャを呼び出すのかMSG構造体のウィンドウハンドルを見てさらにWNDCLASSEX構造体などから判断して決めるのをシステムが行うのでコールバック関数なのかな? DispatchMessage関数が直接ウィンドウプロシージャ呼び出さない理由が知りたい。

専門家に質問してみよう