请教多线程?(100分)

  • 主题发起人 xuekunli
  • 开始时间
X

xuekunli

Unregistered / Unconfirmed
GUEST, unregistred user!
我编了一个监控程序,其中采用了多线程。外部采集卡获取的四路数据通过中断写入一个
全局变量(缓冲区StreamList)中,一个线程负责查询在全局变量StreamList中是否有数
据,如有则处理,并将结果写入另一个全局变量(TesList)中,若没有,则继续重复循
环的不断查询;另一个线程则不断查询TesList中是否有数据,若有,则根据数据进行相
应的操作,若没有则继续重复循环的不断查询。程序能工作,但通过性能监视器观察,
CPU的使用率一直为100%,对界面中的按键等的响应很慢。
请问有没有较好的改进方法,特别是线程中有不断的空循环,影响了效率。请各位
多多指教!!
谢谢!!
 
用event+重叠I/O来处理,具体的可以找我,QQ 775033
 
我没有QQ,请在这里具体介绍一下你的思路,好吗?
 
我不知道你是不是用Readfile来读数据的,如果是那就比较简单了,
用重叠I/O来处理,设置一个超时,这个时间内,进入内核模式,几
乎不占资源如果有数据来系统就会提醒你,你就可以读数据了,
 
数据来自外部数据源,如通信数据。当采集卡某一通道的数据达到1k时,
就产生中断,调用回调函数,将数据和通道号写入StreamList这个全局
变量中;另一个线程查询StreamList中是否有数据,有,则做出分析处理!
 
四路数据通过中断写入一个全局变量(缓冲区StreamList)中
--------所有写入都通过一个函数来写入,这个函数写完之后调用(一个线程负责查询在全局变量StreamList中是否有数
据,如有则处理,并将结果写入另一个全局变量(TesList)中)
同样,写入另一个全局变量(TesList)中后调用另一个线程则
------------------这样就不用不断重复查询了.
方法二:用timer,设定一个时间间隔来查询,你可以调节这个时间间隔来降低cpu占用
 
用TIMER容易丢失数据
 
四路数据的到来是随机的。
 
那有什么关系了,用重叠很容易做到你说的,他最多可以用64个连接
 
请介绍用TEvent怎么做?
 
Event和重叠配合一起使用,
 
重叠是什么意思,我不懂,请介绍!谢谢
 
请介绍以下具体怎么用?谢谢
 
我说个例子:
比如我用这个函数WSARecv()来通过重叠I/O接受数据。
你先createEvent()一个事件,把这个事件作为这个重叠结构的一个值
WSARecv()最后一个参数就是一个重叠结构,把把这个重叠结构传给他
然后就用WSAWaitForMultipleEvents设置一个超时来等待数据到来,
如果数据来了,这个函数就立刻醒来,在就用WSAGetOverlappedResult
来分析接受到的数据的结果
 
我还是不明白!对您说的我不熟悉。使用Event来做的话,怎么考虑Event的使用?如某一路有数据来
就setevent.该用四个Event还是一个?
 
我不太清楚你的四路信号的性质,如果有连接的,就用4个EVENT,如果没有连接
一个就够了,你然后分析你收到的数据结构的内容就可以知道是哪个连接发过来
的数据了,
 
你的例子我看到了。但还是不明白!
 
四路不同的数据,每一路满1k时就向StreamList中写入数据和表示哪一路的属性。
四路数据是随机的。有可能是几乎或同时到,这时就会很快有两次或几次SetEvent,
会因此产生冲突吗?
 
仔细相象,我想应该多少知道了一点
 
请就EVent的使用谈谈你的看法和考虑!谢谢
 
顶部