关于网友提出的“ 多线程处理数据的问题续”问题疑问,本网通过在网上对“ 多线程处理数据的问题续”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 多线程处理数据的问题续
描述: 前几天发了一个 请教一个对其它设备发过来的数据进行处理的问题 的帖子,在得到了各位大侠的指点后,写了一个多线程处理的代码,但执行起来不怎么对,麻烦大家帮我看看哪儿出问题了
主线程是给一台网络中的设备发送上传数据的命令,子线程是处理上传过来的数据,我的想法是在子线程中定义一个消息响应,主线程收到数据后,开辟一段地址空间,把数据存入到这段地址空间中,然后发送消息给子线程,地址也随着消息发过去了,然后子线程慢慢处理就行了。
主线程中这样写的:
m_pSaveThread = (CSaveThread*)AfxBeginThread(RUNTIME_CLASS(CSaveThread));//先创建一个子线程
//给设备循环发送命令
while()
{
。。。。
//每次过来的数据都开辟一段内存,将传过来的数据存到里面
unsigned char *tmp = new unsigned char[numbytes];//numbytes是存储数据需要的字节
CopyMemory(tmp,arrayreturndata,numbytes);//上传过来的数据先是放到arrayreturndata中的
//发送消息给子线程,将数据字段的首地址tmp也顺带发过去
while(!m_pSaveThread->PostThreadMessage(WM_HANDLE,(WPARAM)tmp,NULL))
{
Sleep(10);
}
}
子线程中这样写的:
先定义自己的消息:#define WM_HANDLE WM_USER+101
消息响应函数这样写的:
int CSaveThread::OnHandle(WPARAM wParam, LPARAM lParam)
{
unsigned char *addr=(unsigned char*)wParam;//将地址存下来
//处理数据
//处理结束后释放内存
delete [] addr;
}
我觉得每次主线程发送过去的消息都应该在子线程的消息队列中,然后轮到子线程执行了,子线程会自己按消息队列中的顺序来执行,不知道我这样想对不对?
还有个问题是,CPU是每次把子线程执行结束后再返回主线程吗?还是说主线程和子线程轮流执行相同的时间?这个我也不太清楚,因为我希望主线程那个循环每次循环的越快越好,麻烦各位大侠帮我看看啊
解决方案1:我觉得每次主线程发送过去的消息都应该在子线程的消息队列中,然后轮到子线程执行了,子线程会自己按消息队列中的顺序来执行,不知道我这样想对不对?
只要发送成功,消息就会放到目标线程的消息队列中,线程去消息的顺序与发送的顺序相同。
还有个问题是,CPU是每次把子线程执行结束后再返回主线程吗?还是说主线程和子线程轮流执行相同的时间?这个我也不太清楚,因为我希望主线程那个循环每次循环的越快越好,麻烦各位大侠帮我看看啊
所有线程轮流执行相同的时间,线程可以主动放弃自己的执行时间,可以通过设置线程优先级使某个线程的执行机会多一些或少一些。
以上介绍了“ 多线程处理数据的问题续”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3328154.html