100分,请!请教怎么解决多线程有关问题
100分求助,请高手指点!请问如何解决多线程问题
我现在建立的工程负责从采集卡采数,显示采集的数据波形,并对数据进行处理这三个部分组成。问题在第三部分放在什么地方,请高手指点!
1、当开始监控时候,开启辅助线程,进行数据采集:
gm_pThread=AfxBeginThread(&Thread_IO_InData,this);
2、辅助线程取数到一定数目(200个数),发消息到主线程,由主线程进行
数据曲线显示。
这两步完成时候,协调的很好,采集显示都很顺利!
但是现在要完成第三步,如下:
3、希望每次等待3000个数据显示后,再对之后的6000个数字进行频谱分析,而后将结果输出,可是如果我把这个分析放在Thread_IO_InData这个辅助线程中,程序的显示开始时快时慢。
现在面临问题是:我这个频谱分析好像不能再开一个辅助线程处理吧?不然每采集9000个数据的时间就会重新开一个线程?
请问我该怎么解决这个问题,让处理放在后台,前台的显示不受影响,多谢了!
------解决方案--------------------
我这个频谱分析好像不能再开一个辅助线程处理吧?
开线程无影响
到预计数据个数时 开线程去分析频谱, 分析完毕后线程返回结果,线程结束
如此OK
或者频谱分析线程 可以用循环等待数据方式 等待数据过来再分析,可以不用结束
------解决方案--------------------
一般而言,不会出现 "每采集9000个数据的时间就会重新开一个线程? "这个情况
因为处理线程处理完总是要把自己杀死得么...除非数据来得太快,来不及处理
------解决方案--------------------
同意楼上的
建议再开一个频谱分析线程,
------解决方案--------------------
用内核同步对象
参见
http://www.codeproject.com/threads/ProducerConsumerModel.asp
http://www.codeproject.com/threads/semaphores.asp
http://msdn2.microsoft.com/en-us/library/yy12yx1f(VS.80).aspx
http://developer.amd.com/articles.jsp?id=87&num=3
------解决方案--------------------
增加几个频谱分析线程,所有的线程用线程池管理
------解决方案--------------------
可在辅助线程用while循环,采用事件通知的方式, 采集9000个数据的时侯发出一个通知事件,并重新计数,在辅助线程waitforobject(事件),你这种情况不适于用信号量
------解决方案--------------------
while(start)
{
waitforobject(事件, INFINITE)
//如果事件为true,那么执行,否则等待,直到事件为true
}
两个辅助线程都在while循环中没有问题
对于有新数据进来的问题,你必须提高处理速度,保证处理速度比采集速度快,否则cpu将会一直保持在100%,没法正常工作了,此时就要考虑算法、降低采样频率、提高机器性能等问题
------解决方案--------------------
可都在主线程创建:
CWinThread*gm_pThread;
gm_pThread=AfxBeginThread(&Thread_IO_InData,this);
CloseHandle(gm_pThread);
CWinThread*gm_pThread1;
gm_pThread1=AfxBeginThread(&Thread_IO_InData1,this);
gm_pThread(gm_pThread1);
也可根据需要在程序退出时:
CloseHandle(gm_pThread);
CloseHandle(gm_pThread1);
我现在建立的工程负责从采集卡采数,显示采集的数据波形,并对数据进行处理这三个部分组成。问题在第三部分放在什么地方,请高手指点!
1、当开始监控时候,开启辅助线程,进行数据采集:
gm_pThread=AfxBeginThread(&Thread_IO_InData,this);
2、辅助线程取数到一定数目(200个数),发消息到主线程,由主线程进行
数据曲线显示。
这两步完成时候,协调的很好,采集显示都很顺利!
但是现在要完成第三步,如下:
3、希望每次等待3000个数据显示后,再对之后的6000个数字进行频谱分析,而后将结果输出,可是如果我把这个分析放在Thread_IO_InData这个辅助线程中,程序的显示开始时快时慢。
现在面临问题是:我这个频谱分析好像不能再开一个辅助线程处理吧?不然每采集9000个数据的时间就会重新开一个线程?
请问我该怎么解决这个问题,让处理放在后台,前台的显示不受影响,多谢了!
------解决方案--------------------
我这个频谱分析好像不能再开一个辅助线程处理吧?
开线程无影响
到预计数据个数时 开线程去分析频谱, 分析完毕后线程返回结果,线程结束
如此OK
或者频谱分析线程 可以用循环等待数据方式 等待数据过来再分析,可以不用结束
------解决方案--------------------
一般而言,不会出现 "每采集9000个数据的时间就会重新开一个线程? "这个情况
因为处理线程处理完总是要把自己杀死得么...除非数据来得太快,来不及处理
------解决方案--------------------
同意楼上的
建议再开一个频谱分析线程,
------解决方案--------------------
用内核同步对象
参见
http://www.codeproject.com/threads/ProducerConsumerModel.asp
http://www.codeproject.com/threads/semaphores.asp
http://msdn2.microsoft.com/en-us/library/yy12yx1f(VS.80).aspx
http://developer.amd.com/articles.jsp?id=87&num=3
------解决方案--------------------
增加几个频谱分析线程,所有的线程用线程池管理
------解决方案--------------------
可在辅助线程用while循环,采用事件通知的方式, 采集9000个数据的时侯发出一个通知事件,并重新计数,在辅助线程waitforobject(事件),你这种情况不适于用信号量
------解决方案--------------------
while(start)
{
waitforobject(事件, INFINITE)
//如果事件为true,那么执行,否则等待,直到事件为true
}
两个辅助线程都在while循环中没有问题
对于有新数据进来的问题,你必须提高处理速度,保证处理速度比采集速度快,否则cpu将会一直保持在100%,没法正常工作了,此时就要考虑算法、降低采样频率、提高机器性能等问题
------解决方案--------------------
可都在主线程创建:
CWinThread*gm_pThread;
gm_pThread=AfxBeginThread(&Thread_IO_InData,this);
CloseHandle(gm_pThread);
CWinThread*gm_pThread1;
gm_pThread1=AfxBeginThread(&Thread_IO_InData1,this);
gm_pThread(gm_pThread1);
也可根据需要在程序退出时:
CloseHandle(gm_pThread);
CloseHandle(gm_pThread1);