thrId1 = GetGPSThreadID();

//问题在这里??????加上这句才可以进到那个dll中的消息循环
    AfxMessageBox("jjjj"); //存贮过程reprott
strcpy(info->sqlstr, "reprott");
::PostThreadMessage(thrId1, SAVEDATA, (unsigned int)info, 0);-----------------------------------------------------------------------
     在dll中的函数 得到一个线程id
-----------------------------------------------------------------------
EXPORT DWORD GetGPSThreadID()
{
//建立返回线程ID, 和建立PostThreadMessage的响应消息
    thread = (HANDLE)::_beginthreadex(NULL, 0, &GpsThreadProc, NULL, 
                              0, (unsigned int *)&ThreadID);
if(thread==NULL)
{
::MessageBox(NULL, "建立线程ID失败!!!", NULL, MB_OK);
        exit(0);
}
else
{
ResumeThread(thread);
}
::CloseHandle(thread);}-----------------------------------------------------------------------
         这个线程的响应函数
-----------------------------------------------------------------------
unsigned __stdcall GpsThreadProc( LPVOID lpvoid )
{
MSG msg;
BOOL notDone=TRUE;
   while(notDone)
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
{
switch(msg.message)
{
case SAVEDATA:
//建立数据队列存贮GPS数据
AddQueue(*info);
break;
default:
::TranslateMessage(&msg);
::DispatchMessage(&msg);
break;
}
}
}
return TRUE;
}

解决方案 »

  1.   

    建议搂主执行到thrId1 = GetGPSThreadID(); 这句时切换到反汇编代码,跟踪到call 代码,f11跟进去,应该就可以,和message这句没关系!
      

  2.   

    应该是调用了GUI函数才使得进程具有了消息队列。
      

  3.   

    应该说是主要是因为PostThreadMessage目标线程可能并未真正运行起来将AfxMessageBox换成Sleep试试?另外,UI线程,我建议从CWinThread派生,并且使用AfxBeginThread.
      

  4.   

    现在你的问题在于:
    当主线程调用GetGPSThreadID()接口时,为你创建了一个线程执行体,但这时GpsThreadProc线程
    不会保证这个线程就马上开始执行,接着主线程继续执行PostThreadMessage()函数,要使PostThreadMessage()函数执行成功,要有一个前提就是用PostThreadMessage()发送的目标线程必须要有线程消息队列,windows系统在创建一个新的线程时并不具备线程消息队列,所以PostThreadMessage()执行会失败。
    另一方面,当一个线程没有消息队列时,如果调用GUI相关的函数系统会自动创建一个线程消息队列,
    比如说某线程没有消息队列时,调用GetMessage(),PeekMessage(),CreateWindow()等等API就会创建一个线程消息队列。
    楼主可以用下面方法解决:
    1。
    thrId1 = GetGPSThreadID();
    strcpy(info->sqlstr, "reprott");
    while(!::PostThreadMessage(thrId1, SAVEDATA, (unsigned int)info, 0))
    {}//直到消息发送成功为此,因为在你的GpsThreadProc线程里会执行到PeekMessage()函数,如果没有线程消息队列会自动创建它,所以PostThreadMessage()肯定会执行成功。
    ...
    或者
    2。EXPORT DWORD GetGPSThreadID()
    {
        HANDLE hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
    //建立返回线程ID, 和建立PostThreadMessage的响应消息
        thread = (HANDLE)::_beginthreadex(NULL, 0, &GpsThreadProc, hEvent, 
                                  0, (unsigned int *)&ThreadID);
        ::WaitForSingleObject(hEvent,INFINITE);//等待直到创建的线程创建它自已的消息队列为止
        ::CloseHandle(hEvent);
        ::CloseHandle(thread);   ......
    }
    在创建线程时传递一个事件,在GpsThreadProc()中如下:
    unsigned int __stdcall GpsThreadProc(LPVOID pContext)
    {
      HANDLE hEvent  = (HANDLE)pContext;
      MSG msg;
      ::PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE);//强制创建线程消息队列
      ::SetEvent(hEvent);
      ....
      ....
    }
      

  5.   

    保证线程的消息队列已经建立,
    当有GUI操作时,系统会自动为线程创建消息队列
    或者线程中自己建立一个消息队列来接收
      

  6.   

    可以用内核事件event来控制流程
      

  7.   

    这个问题我解决拉的,不过我也离职拉的,呵,那个postthreadmessage往线程里发的时候,是要
    sleep一下的,这是msdn上说的,