我在主线程中启动一个线程,然后使用GetMessage函数使主线程进入消息循环,并在子线程正常返回前发送自定义的线程退出消息到主线程(用PostThreadMessage函数发送,线程ID用全局变量传递给子线程),但子线程一返回,整个进程都结束了!这个怎么回事?我还在主线程返回前加上MessageBox,但却没有执行到进程就已经结束了,说明主线程根本没有正常结束……(sdk)
附部分代码:
主线程:
do
{
 HANDLE  jhModule = CreateThread( NULL, 0, nThread, NULL, 0, &jThreadId);    CloseHandle(jhModule); if(GetMessage(&jmsg, NULL, 0, 0))
{
switch(jmsg.message)
{
case  WM_RECON:
continue;
break;
default:
break;
}
}
else break; }while(1); MessageBox(NULL,"主线程退出!!!","警告",NULL); return 0;子线程:                                        ret = send(jsocket, DataToSend, jrs, 0);
if(ret == SOCKET_ERROR)
{
err = WSAGetLastError(); //错误待处理!! if(err == WSAECONNRESET || err == WSAETIMEDOUT || err == WSAESHUTDOWN || err == WSAENETRESET) PostThreadMessage(threadid, WM_TEXT, NULL, NULL);                                                 return 0;
                                          }我调试时程序能正确执行到PostThreadMessage,然后走过return就弹出汇编窗口,前面一排指令地址是0x7XXXXXXXX,说明是在系统领空里,我一按f5继续运行,程序就退出了!!!在主线程的GetMessage下断点也没有任何作用……
为什么子线程正常返回,整个进程就结束了?望高手赐教!

解决方案 »

  1.   

    上面的WM_RECON和WM_TEXT本来是一样的,是不小心打错的……
      

  2.   

    在主线程的GetMessage之后不停的Trace(msgno)试试,也许能找到线索
      

  3.   

    小弟再调试了一下,发现子线程运行到call 7C80C058(ExitThread函数)提示The thread has exited with 0x0,提示线程已经结束!导致进程无法正常运行下去。但据说用异步方式才会在关闭socket时自动关闭线程,但我用的不是异步方式啊(难道是因为socket被强迫关闭,所以系统自动关闭了线程?)唉,真是烦啊。。