Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向属于其他线程的窗口发送消息。可能的僵局?_C++_Windows_Deadlock - Fatal编程技术网

C++ 向属于其他线程的窗口发送消息。可能的僵局?

C++ 向属于其他线程的窗口发送消息。可能的僵局?,c++,windows,deadlock,C++,Windows,Deadlock,我想我已经陷入了僵局,几个小时以来一直在寻找解决办法。有什么建议吗? 我正在尝试做的是:在开始时单击“名称”按钮,创建向服务器发送请求的线程,然后获取答案,在得到答案后,该线程必须向主进程发送初始化游戏窗口的消息 属于WinMain的消息进程: LRESULT CALLBACK WndProc(HWND myWindow, UINT messg, WPARAM wParam, LPARAM lParam) { switch (messg) {

我想我已经陷入了僵局,几个小时以来一直在寻找解决办法。有什么建议吗? 我正在尝试做的是:在开始时单击“名称”按钮,创建向服务器发送请求的线程,然后获取答案,在得到答案后,该线程必须向主进程发送初始化游戏窗口的消息

属于WinMain的消息进程:

LRESULT CALLBACK WndProc(HWND myWindow, UINT messg, WPARAM wParam, LPARAM lParam)
   {
        switch (messg) {
               case WM_STARTGAME:
            DestroyWindow(hStartGameButton);
            DestroyWindow(hHistoryButton);

            InitGameWindow(myWindow);
        break;


                case WM_COMMAND:

                  switch(LOWORD(wParam))
                  {
                        case IDC_STARTGAME_BUTTON:
                        {
                          parametros param;
                          param.myWindow = myWindow;

                          start_game = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStartGame, (LPVOID)&myWindow, 0, NULL);
                        }

                  }
   }
这就是线索:

DWORD WINAPI ThreadStartGame(LPVOID param){
HWND w = (HWND)param;
DWORD n;
BOOL ret;
mensagem resposta;


mensagem msg;
msg.tipo = COMECAR_JOGO;
msg.verifica = true;

if (!WriteFile(hPipe, &msg, (DWORD)sizeof(mensagem), &n, NULL)) {return 0;}

    ret = ReadFile(hPipeN, &resposta, (DWORD)sizeof(mensagem), &n, NULL);
    if (!ret || !n) {
        return false;
     }

PostMessage(w, WM_STARTGAME, NULL, NULL); // <- THIS GETS EXECUTED BUT NOTHINK HAPPENS AFTER

return 0;
}

我认为这里没有任何僵局

start_game = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStartGame, (LPVOID)&myWindow, 0, NULL);
此行将HWND的地址传递给thread&myWindow

HWND w=HWNDparam

此行使用地址本身作为HWND,SendMessage将消息发送到此地址,该地址不是HWND

试着修改


start\u game=CreateThreadNULL,0,LPTHREAD\u start\u routinethreadstartName,LPVOIDmyWindow,0,NULL

W/o即使看了代码,我也可以马上告诉您:不要在线程之间使用SendMessage。我建议你阅读和阅读:

在UI线程中使用异步窗口消息API,特别是通过将SendMessage替换为其非阻塞对等项之一:PostMessage、SendNotifyMessage或SendMessageCallback

。。。 任何跨越线程边界的阻塞调用都具有可能导致死锁的同步属性。调用线程执行具有“acquire”语义的操作,并且在目标线程“释放”该调用之前无法解除阻止。相当多的User32函数(例如SendMessage)以及许多阻塞COM调用都属于这一类


首先,你不可能一开始就这么做。引述:

调用C运行时库CRT的可执行文件中的线程应使用_beginthreadex和_endthreadex函数进行线程管理,而不是使用CreateThread和ExitThread;这需要使用多线程版本的CRT。如果使用CreateThread创建的线程调用CRT,CRT可能会在内存不足的情况下终止进程

其次,您的线程可以是worker或UI线程,从第一种类型开始,您不能调用大多数与窗口相关的函数,因为它没有消息泵。窗户就是这样。很多次,我尝试使用MessageBox,尽管我自己在上面几行的评论中说它在该函数中是禁止的


对于工作线程,通常的方法是使用PostThreadMessage并在UI线程上作出反应。如果你有多个UI线程,我不知道规则,我从来没有足够的勇气去做这件事。

Windows不属于线程。谢谢你,将第四个参数从LPVOID&myWindow更改为LPVOIDmyWindow解决了问题谢谢你的答案和链接,虽然当我尝试PostMessage时,我仍然有这个问题。PermanentGuest显示了这个问题。我的观点超出了立即解决的范围:不要在线程之间使用SendMessage,即使在获得正确的HWND之后也是如此。