线程的消息队列问题,有一定难度,求高手请教 我用_beginthreadex()创建个线程,线程函数中用了GetMessage(),创建完我用PostThreadMessage()发送消息,但发送失败,因为线程的消息队列还没建好。只有线程调用GetMessage()才创建了消息队列。求教,我怎么才能让_beginthreadex()函数返回时,消息队列就创建好?程序不能用MFC类库。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个THREADINFO结构,并将这个数据结构与线程联系起来。THREADINFO就是线程的消息队列 对。当线程有了与之相联系的THREADINFO结构时,线程就有了自己的消息队列集合。 我晕,关建是怎么才能让_beginthreadex函数执行完就与THREADINFO关联上啊? 1、既然是Win32程序,何必使用_beginthreadex来创建线程你调用CreateThread函数,返回线程句柄的同时,线程就应该准备OK了2、就算你用_beginthreadex,你完全可以设置一个Event信号量,当线程运行时SetEvent执行完_beginthreadex,就判断这个信号量 HANDLE hEvent = ::CreateEvent(NULL,FALSE,TRUE,NULL);HANDLE hthread = (HANDLE)_beginthread(NULL,NULL,ThreadProc,(LPVOID)hEvent,...);::WaitForsingleObject(hEvent,INFINITE);::Closehandle(hEvent);...::PostThreadMessage(...);DWORD __stdcall ThreadProc(LPVOID pContext){ MSG msg; ::PeekMessage(&msg,NULL,NULL,NULL,NULL);//强制创建线程消息队列 ::SetEvent((HANDLE)pContext); ... ::GetMessage(&msg,...); return NULL;} 呵,如果 lianglp() ( ) 的方法的话,倒更不合算,因为更占资源,还不用用个循环,一个劲的测PostThreadMessage呢,不能通过设置来让线程一创建就与THREADINFO关联吗?我查了很多资料都没找到。 上面几位都说的很清楚了,自已就不能想办法。在线程的第一句,就来一个PeekMessage,在_beginthread后来一个Sleep(10).不过我没试过,想来可以。 THREADINFO这个东西,除了Windows核心编程,一般鲜有提及——它本来就是一个Undocumented的结构。也就是说,你可以知道它的存在和它的意义,却不应该尝试去操作它。 如何在vs2010中创建窗体? opengl如何保存当前的缓冲区,在一下又可以恢复保存的缓冲区 高分悬赏:拦截Windows下的全局屏幕缓冲区 唐太宗与宇文士及 50分求救BCG工具条添加Button问题!望速于解答,小弟在线等待! 请教关于ocx控件的问题 求解难题:已知被打开的有效的HKEY值,能不能根据这个求得这个HKEY所对应的键名? 循环列表问题 高手帮帮忙!!!如何在打印机打印粗线 DLL挂钩解决程序多开卡的问题 哪里有打包的论坛精华,或者一些个人总结的打包下载? 一个简单的语法问题?
当线程有了与之相联系的THREADINFO结构时,线程就有了自己的消息队列集合。
你调用CreateThread函数,返回线程句柄的同时,线程就应该准备OK了2、就算你用_beginthreadex,你完全可以设置一个Event信号量,当线程运行时SetEvent
执行完_beginthreadex,就判断这个信号量
HANDLE hthread = (HANDLE)_beginthread(NULL,NULL,ThreadProc,(LPVOID)hEvent,...);
::WaitForsingleObject(hEvent,INFINITE);
::Closehandle(hEvent);...
::PostThreadMessage(...);DWORD __stdcall ThreadProc(LPVOID pContext)
{
MSG msg;
::PeekMessage(&msg,NULL,NULL,NULL,NULL);//强制创建线程消息队列
::SetEvent((HANDLE)pContext); ...
::GetMessage(&msg,...); return NULL;
}
也就是说,你可以知道它的存在和它的意义,却不应该尝试去操作它。