class GLThread
{
public:
GLThread();
~GLThread();
void Run();
HANDLE GetHandle();
DWORD GetThreadID();
protected:
static unsigned int __stdcall ThreadFunc(LPVOID thisObj);
protected:
HANDLE mThreadHandle;
HANDLE threadSynchroEventHandle;
DWORD mThreadId;
};
unsigned int __stdcall GLThread::ThreadFunc(LPVOID thisObj)
{
GLThread * glThrd = (GLThread *)thisObj;
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
SetEvent(glThrd->threadSynchroEventHandle);
while (true)
{
GetMessage (&msg, NULL, 0, 0);
int test = 0;
test++;
}
return 0;
}
GLThread::GLThread()
:mThreadHandle(0),
mThreadId(0)
{
}
GLThread::~GLThread()
{
}
void GLThread::Run()
{
//设置同步操作目的:当退出Run函数时 可以向线程发消息
//如果不同步 发消息则可以失败
threadSynchroEventHandle = CreateEvent(NULL, TRUE, FALSE, NULL);
//一定要换成beginthread
unsigned threadID;
unsigned int handle = _beginthreadex(0, 0, ThreadFunc, this, 0, &threadID);
mThreadHandle =reinterpret_cast <HANDLE>(handle);
mThreadId = threadID;
WaitForSingleObject(threadSynchroEventHandle, INFINITE);
CloseHandle(threadSynchroEventHandle);
}
HANDLE GLThread::GetHandle()
{
return mThreadHandle;
}
DWORD GLThread::GetThreadID()
{
return mThreadId;
}
发送消息到某线程的消息队列中。发送后,立即返回,不用等待此线程处理这个消息。
BOOL WINAPI PostThreadMessage(
_In_ DWORD idThread,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
参数
idThread [in]
Type: DWORD
发送消息到某线程的线程ID
如果此线程没有消息队列,此函数调用失败。当此线程第一次调用用户定义的函数或GDI函数时,系统创建线程的消息队列。详细信息参见"注意"部分。
Msg [in]
Type: UINT
消息类型
wParam [in]
Type: WPARAM
消息参数
lParam [in]
Type: LPARAM
消息参数
返回参数
Type: BOOL
如果函数调用成功,则返回非零值。
注意
要向线程发送消息必须要创建一个消息队列,否则调用PostThreadMessage函数会失败。使用下面的方法解决这个问题。
创建一个事件对象,然后创建一个线程。
在调用PostThreadMessage函数之前,使用WaitForSingleObject函数,等待事件对象被激发,
在接收消息的线程中,使用PeekMessage,强制系统创建一个消息队列。
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
设置事件,指明此线程已经准备好了接收消息
接收消息的线程调用GetMessage或PeekMessage接收消息。得到的MSG结构体中的hwnd成员为NULL。
使用PostThreadMessage发送消息不需要绑定一个窗口。通常,没有与绑定窗口的消息不能使用DispatchMessage函数分发消息。因此,如果此线程在一个模态循环里(如果使用MessageBox或DialogBox),此消息将丢失。当在模态循环时,使用线程钩子截获线程。
操作系统不会marshalling系统消息(系统消息范围0到WM_USER-1)。为了发送消息(大于等于WM_USER)给其它线程,你必须自定义marshalling。
每一个消息队列至多能容纳10,000个消息。此限制已足够大了。如果你的程序想突破此限制,那应该重新设计来避免使用过多的系统资源。
为了修改此限制,可修改如下注册表中的键值
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows NT
CurrentVersion
Windows
USERPostMessageLimit