请问这种情况用几个线程合适? 我觉得2个线程就可以了,一个采集数据写入buffer,一个数据分析。两个线程要同步,buffer满了就送去分析,分析完了再写。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Picker, Analyser1个线程Picker流程如下:while 1: pick up data if (data is null or stop?) break; write buffer if (buffer is full) { Dispatch buffer to Analyser Empty buffer } 补充:如果必须保持Picker和Analyser同步, 当buffer is full, 可为Analyser再开一个线程, 两个线程即可。读写buffer是两个线程都要用的功能,封装成函数供线程调用,无需独立使用线程,但是要使用同步对象。 1,串口采集2,数据分析3. GUI "读写buffer是两个线程都要用的功能,封装成函数供线程调用,无需独立使用线程,但是要使用同步对象。"这个是啥子意思?用全局函数?另外,补充一下,并非buffer full了才进行数据analysis,而是采集到一条完整的data之后就进行analysis,此时buffer有可能是满的也有可能不是满的。再扩展一下,如果这时候是多个串口需要采集呢?谢谢! 可以不是全局函数。例如把缓冲区封装成一个类CBuffer,提供Read和Write方法,因为方法是被多线程调用的,方法内部使用同步对象对线程进行同步。主线程创建一个类实例,例如CBuffer buf;其它线程可以直接访问buf的方法。 多谢,不好意思,能否再详细说一下其他线程怎么调用这个buf的方法呢?新手,不好意思。是传buf的指针给其他线程吗? 是的,作为子线程入口参数,在CreateThread的时候,将指针传进去。// 线程安全的Buffer类class SyncBuf{....};// 子线程入口函数DWORD WINAPI startFunc(LPVOID lpParam);{ SyncBuf *pBuf = (SyncBuf*)lpParam; // pBuf->Read(); pBuf->Write();}// 主线程SyncBuf buf;CreateThread(NULL, 0, startFunc, (LPVOID)&buf, 0, 0);建议3个线程的方案。理由:GUI最好用单独的一个线程,因为如果是图形用户界面,响应速度是必须要保证的。如果跟其他操作合伙儿用1个线程,也许用户在按按钮的时候,线程正在忙着做分析,没时间响应,表现为“卡机”现象。数据采集和分析分开,为的是及时能采集到串口上的数据,防止串口上数据丢失的情况。串口自身的buffer可能很小,如果不及时采集,有可能满,从而丢失数据或旧数据被覆盖。 Buffer类内部的实现,可以用循环队列来做,建议楼主看看“生产者-消费者”问题,跟这个类似的。采集到数据以后,怎样通知分析线程:可以使用Semaphore来实现。多个串口:仍然可以使用3线程方案。采集数据仍用1个线程来做。因为采集数据只涉及到数据的读写操作,单线程轮询应该速度够了。线程开多了,速度也不一定能上去,因为活跃线程数>CPU数后,线程切换造成的开销会增大,得不偿失。 vc SQL 语句出错 树控件 显示数据 VC-MFC程序中怎么打开一个网页并向其文本框中自动加入数据 如何将 HBITMAP 赋值到 char* 中(我想读取一张图到字符串) 软件加密的最佳方案------加密狗!!! 求扑克牌源代码 在哪里能找到关于window消息队列的资料 三级A考试,关于栈的问题 >>>在同一线程内,能不能创建两个线程模型(ThreadingModel)不一样的com对象,一个是Apartment,另一个是Free???? 关于CButton类的属性——在线等待! 请各位帮我看看这个问题怎么做? 如何以动态链接的方式使用dll中的类(非MFC)
pick up data
if (data is null or stop?)
break; write buffer
if (buffer is full)
{
Dispatch buffer to Analyser
Empty buffer
}
如果必须保持Picker和Analyser同步, 当buffer is full, 可为Analyser再开一个线程,
2,数据分析
3. GUI
这个是啥子意思?用全局函数?另外,补充一下,并非buffer full了才进行数据analysis,而是采集到一条完整的data之后就进行analysis,此时buffer有可能是满的也有可能不是满的。再扩展一下,如果这时候是多个串口需要采集呢?谢谢!
是传buf的指针给其他线程吗?
class SyncBuf
{....};// 子线程入口函数
DWORD WINAPI startFunc(LPVOID lpParam);
{
SyncBuf *pBuf = (SyncBuf*)lpParam;
// pBuf->Read(); pBuf->Write();
}// 主线程
SyncBuf buf;
CreateThread(NULL, 0, startFunc, (LPVOID)&buf, 0, 0);
建议3个线程的方案。理由:
GUI最好用单独的一个线程,因为如果是图形用户界面,响应速度是必须要保证的。如果跟其他操作合伙儿用1个线程,也许用户在按按钮的时候,线程正在忙着做分析,没时间响应,表现为“卡机”现象。
数据采集和分析分开,为的是及时能采集到串口上的数据,防止串口上数据丢失的情况。串口自身的buffer可能很小,如果不及时采集,有可能满,从而丢失数据或旧数据被覆盖。
采集到数据以后,怎样通知分析线程:可以使用Semaphore来实现。多个串口:
仍然可以使用3线程方案。采集数据仍用1个线程来做。因为采集数据只涉及到数据的读写操作,单线程轮询应该速度够了。
线程开多了,速度也不一定能上去,因为活跃线程数>CPU数后,线程切换造成的开销会增大,得不偿失。