15,472
社区成员
发帖
与我相关
我的任务
分享
::PostThreadMessage(dwDrawThreadID,WM_QUIT,0,0);
WaitForSingleObject(m_hDrawThread,3000);
#include "stdafx.h"
#include <windows.h>
#pragma comment(lib, "User32.lib")
HANDLE m_hDrawThread = NULL;
DWORD dwDrawThreadID = 0;
DWORD WINAPI MyThread(LPVOID lpParam)
{
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
if (!msg.hwnd)
{
int i = 0;
}
//OnThreadMessage(msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
return 0;
}
void CloseThread()
{
// Sleep(1000);
BOOL bRet = ::PostThreadMessage(dwDrawThreadID,WM_QUIT,0,0);
DWORD dwLastError = GetLastError();
//WaitForSingleObject(m_hDrawThread,3000);
WaitForSingleObject(m_hDrawThread,INFINITE);
}
int main(int argc, char **argv)
{
m_hDrawThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwDrawThreadID); // returns the thread identifier
CloseThread();
return 0;
}
[/quote]
事实是我消息队列之前就创建了,不知道你说的消息队列是什么意思。我之前程序有其他消息操作正常接收,就是关闭的时候没法接收,而且。你这个主线程一直等待子线程关闭,最后不知道你是怎么关闭的,至于你说的卡,就是因为子线程未关闭,主线程一直等待,wait设置超时5秒,只会卡5秒。如果你说真的消息成功发送接收处理,那么子线程立即退出,主线程根本感觉不到等待。
而且你觉得是消息队列的问题,那你可以之前发其他的消息测试看看,直到正确后你再WM_Qiut和Wait。然后看看子线程是怎么退出的。
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
if (!msg.hwnd)
{
int i = 0;
}
//OnThreadMessage(msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
//afxmessagebox打印。你在这里打印东西就知道成功结束没有,还是最后选择强杀。[/quote]
一个线程一个消息队列,不要认为有其他线程能成功接收消息,这个子线程就有消息队列。
当没有消息时,子线程会一直卡在while (GetMessage(&msg, 0, 0, 0))这里,而当接收到WM_QUIT 消息时,GetMessage()会返回0(接收到其他消息返回非0),就退出while循环,子线程就会结束,主线程中的Wait也就能正常返回,主线程正常结束。
所以,加上afxmessagebox,也是一定会弹出messagebox的。
#include "stdafx.h"
#include <windows.h>
#pragma comment(lib, "User32.lib")
HANDLE m_hDrawThread = NULL;
DWORD dwDrawThreadID = 0;
DWORD WINAPI MyThread(LPVOID lpParam)
{
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
if (!msg.hwnd)
{
int i = 0;
}
//OnThreadMessage(msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
return 0;
}
void CloseThread()
{
// Sleep(1000);
BOOL bRet = ::PostThreadMessage(dwDrawThreadID,WM_QUIT,0,0);
DWORD dwLastError = GetLastError();
//WaitForSingleObject(m_hDrawThread,3000);
WaitForSingleObject(m_hDrawThread,INFINITE);
}
int main(int argc, char **argv)
{
m_hDrawThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwDrawThreadID); // returns the thread identifier
CloseThread();
return 0;
}
[/quote]
事实是我消息队列之前就创建了,不知道你说的消息队列是什么意思。我之前程序有其他消息操作正常接收,就是关闭的时候没法接收,而且。你这个主线程一直等待子线程关闭,最后不知道你是怎么关闭的,至于你说的卡,就是因为子线程未关闭,主线程一直等待,wait设置超时5秒,只会卡5秒。如果你说真的消息成功发送接收处理,那么子线程立即退出,主线程根本感觉不到等待。
而且你觉得是消息队列的问题,那你可以之前发其他的消息测试看看,直到正确后你再WM_Qiut和Wait。然后看看子线程是怎么退出的。
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
if (!msg.hwnd)
{
int i = 0;
}
//OnThreadMessage(msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
//afxmessagebox打印。你在这里打印东西就知道成功结束没有,还是最后选择强杀。
#include "stdafx.h"
#include <windows.h>
#pragma comment(lib, "User32.lib")
HANDLE m_hDrawThread = NULL;
DWORD dwDrawThreadID = 0;
DWORD WINAPI MyThread(LPVOID lpParam)
{
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
if (!msg.hwnd)
{
int i = 0;
}
//OnThreadMessage(msg.message, msg.wParam, msg.lParam);
DispatchMessage(&msg);
}
return 0;
}
void CloseThread()
{
// Sleep(1000);
BOOL bRet = ::PostThreadMessage(dwDrawThreadID,WM_QUIT,0,0);
DWORD dwLastError = GetLastError();
//WaitForSingleObject(m_hDrawThread,3000);
WaitForSingleObject(m_hDrawThread,INFINITE);
}
int main(int argc, char **argv)
{
m_hDrawThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
NULL, // argument to thread function
0, // use default creation flags
&dwDrawThreadID); // returns the thread identifier
CloseThread();
return 0;
}
::PostThreadMessage(dwDrawThreadID,WM_QUIT,0,0);
WaitForSingleObject(m_hDrawThread,3000);