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;
}
//问题在这里??????加上这句才可以进到那个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;
}
解决方案 »
- 求推荐几本网络游戏编程方面的书
- 字符串逐个在edit中显示 急!!!
- 关于按钮贴图
- 急,网页控件OCX加载dll
- 在CPropertyPage上使用list control控件的问题
- 如何获取webbrowser里面的指定id的图片
- 这几行代码为什么得不到正确的系统时间?
- 关于Html的显示问题
- c盘win xp重装 win98后,D盘资料看不到,如何调回d盘资料?急急!!!!
- UpdateData(TRUE)、UpdateData()和 UpdateData(FALSE)有什么区别??
- 高手指点:我是学VC的新手,想学 网络游戏 或 网络互动软件 的开发,请高手指点一下学习路线图!
- 《《《《《哪位有与MSN通信的简单的示例代码??
当主线程调用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);
....
....
}
当有GUI操作时,系统会自动为线程创建消息队列
或者线程中自己建立一个消息队列来接收
sleep一下的,这是msdn上说的,