0

アプリケーションにウィンドウとスレッドを作成しました。ここで、スレッドがデータを処理してメインウィンドウに表示するようにします。この目的のために、スレッド内でPostMessage()関数を使用しました。つまり、ウィンドウが作成され、次にスレッドが作成されます。スレッドはデータに何らかの処理を適用し、データを表示する必要があるというメッセージをメインウィンドウに投稿します。ただし、問題は、この目的のために、ウィンドウのハンドルを渡す必要があることです。このスレッドでは、メインウィンドウのハンドルは宣言されていない識別子です。メインウィンドウへのハンドルをスレッドに渡して、このハンドルを使用してスレッドがメッセージを投稿できるようにする方法はありますか?以下は、ヘルプのコードスニペットです。

///Thread Function////
DWORD WINAPI threadFunction(LPVOID param)
{   
  //do something
   PostMessage(hMainWin, WM_thread,0, 0);
   return true;
}

////Main Function///
int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
   const char AH_Glb_ClassName[] = "myWindClass";
   WNDCLASSEX wc;
   MSG Msg;
   //Registering the Window Class
   wc.cbSize        = sizeof(WNDCLASSEX);
   wc.style         = 0;
   wc.lpfnWndProc   = WndProc;
   wc.cbClsExtra    = 0;
   wc.cbWndExtra    = 0;
   wc.hInstance     = NULL;
   wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = NULL;
   wc.lpszClassName = AH_Glb_ClassName;
   wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
   HWND hMainWin;       //Handle to Main WIndow
   ///Creating Main Window///
   hMainWin = CreateWindowEx(                                       WS_EX_CLIENTEDGE,
                                        AH_Glb_ClassName,
                                        "I am SERVER Window",
                                        WS_OVERLAPPEDWINDOW,
                                        CW_USEDEFAULT,
                                        CW_USEDEFAULT,
                                        440,
                                        120,
                                        NULL, NULL, NULL, NULL);
   if(hMainWin == NULL)
      {
         MessageBox(NULL,
                    "Window Creation Failed!",
                    "Error!",
                    MB_ICONEXCLAMATION | 
                    MB_OK);
         return 0;
      }
   ShowWindow(hMainWin,SW_MAXIMIZE);
   UpdateWindow(hMainWin);
   /////////////////THREAD////////////////
   DWORD threadID = 0;
   ///Creating Thread///
   HANDLE threadHandle = CreateThread(NULL,
                                      0,
                                      threadFunction,
                                      0,
                                      0,
                                      &threadID);

   return 0;
}
4

1 に答える 1

7
DWORD WINAPI threadFunction(LPVOID param)
{   
     HANDLE hwnd = (HANDLE)param;
}

...

HANDLE threadHandle = CreateThread(NULL,
                                  0,
                                  threadFunction,
                                  (LPVOID)hMainWin,
                                  0,
                                  &threadID);

スレッド関数にはタイプがあり、Win32とx64の両方でタイプLPVOIDと一致します。HANDLE

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

ところで、WinMainにメッセージループを追加する必要があります。

于 2013-03-20T07:52:13.713 に答える