我用_beginthreadex()创建个线程,线程函数中用了GetMessage(),创建完我用PostThreadMessage()发送消息,但发送失败,因为线程的消息队列还没建好。只有线程调用GetMessage()才创建了消息队列。求教,我怎么才能让_beginthreadex()函数返回时,消息队列就创建好?程序不能用MFC类库。

解决方案 »

  1.   

    当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个THREADINFO结构,并将这个数据结构与线程联系起来。THREADINFO就是线程的消息队列
      

  2.   

    对。
    当线程有了与之相联系的THREADINFO结构时,线程就有了自己的消息队列集合。
      

  3.   

    我晕,关建是怎么才能让_beginthreadex函数执行完就与THREADINFO关联上啊?
      

  4.   

    1、既然是Win32程序,何必使用_beginthreadex来创建线程
    你调用CreateThread函数,返回线程句柄的同时,线程就应该准备OK了2、就算你用_beginthreadex,你完全可以设置一个Event信号量,当线程运行时SetEvent
    执行完_beginthreadex,就判断这个信号量
      

  5.   

    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;
    }
      

  6.   

    呵,如果 lianglp() ( ) 的方法的话,倒更不合算,因为更占资源,还不用用个循环,一个劲的测PostThreadMessage呢,不能通过设置来让线程一创建就与THREADINFO关联吗?我查了很多资料都没找到。
      

  7.   

    上面几位都说的很清楚了,自已就不能想办法。在线程的第一句,就来一个PeekMessage,在_beginthread后来一个Sleep(10).不过我没试过,想来可以。
      

  8.   

    THREADINFO这个东西,除了Windows核心编程,一般鲜有提及——它本来就是一个Undocumented的结构。
    也就是说,你可以知道它的存在和它的意义,却不应该尝试去操作它。