用线程实现RS232串口通信,可是资源占用好大,怎么解决?
系统有三个线程,主线程负责刷屏显示,一个子线程A负责接受pci总线上的图像采集信号,另一个子线程B负责监视com1,如果不开B线程,主线程的刷屏速度可以在40帧以上,可是开了B线程以后就不到20帧了。这是什么原因?A线程的数据量可是比B线程的要大的多啊,可是怎么B线程对系统的影响这么大呢?有什么更好解决串口通信的办法吗?在没有窗口面板的程序里要怎么把控件加到某一个窗口上?
问题点数:100、回复次数:12Top
1 楼DentistryDoctor(Data Recovery -- http://www.powerdatarecovery.com)回复于 2005-04-04 11:47:26 得分 50
串口通信线程是不是个busy loop?
WaitCommEvent?Top
2 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 12:15:58 得分 5
线程中是否有很占CPU的处理Top
3 楼ericzhangali(另一个空间)回复于 2005-04-04 12:41:45 得分 5
B做了些什么Top
4 楼qrlvls( 空 气 )回复于 2005-04-04 12:53:08 得分 0
agree to DenstryDoctorTop
5 楼qrlvls( 空 气 )回复于 2005-04-04 12:53:44 得分 30
http://vckbase.com/code/listcode.asp?mclsid=9&sclsid=907Top
6 楼happydingdang(我要up出星星)回复于 2005-04-04 14:19:20 得分 0
B大多数时间都是waitforsingleobject,其实就是在等待commeventTop
7 楼allen7757(漫步VS新月)回复于 2005-04-04 14:45:59 得分 5
线程B占用了CPU资源,应该让主线程支配。Top
8 楼jmcooler()回复于 2005-04-04 14:47:22 得分 5
你先把A线程挂起,测试看看究竟B线程是否一直占用CPU。有可能你的B线程写的有问题,然后就一直
有串口事件触发,就一直不停的循环。
要在没有界面的程序里创建控件,一般必须创建一个窗口,而且这个窗口必须要位于具备消息循环的线程里(就是用户界面线程),如果把它放在工作线程(没有消息循环)里,那是不起作用的。
如果仅仅需要一个窗口来传递消息,那么不如直接用带消息循环的线程来传递消息。
如果非要一个窗口并放入控件,那么可以定义如下的线程函数。
DWORD WINAPI WinMsgLoopProc( LPVOID lpParam )
{
MSG msg;
//这里创建一个窗口,并创建其中的控件
while( GetMessage( &msg, 0, 0, NULL ) ) //这句也将强迫系统为本线程建立消息队列
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
//当然别忘了程序退出时,给这个线程发一个WM_QUIT消息。Top
9 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 14:51:12 得分 0
Sleep一下,或设置个超时Top
10 楼jmcooler()回复于 2005-04-04 14:54:56 得分 0
明白我的意思不?
窗口具有消息Post和响应,界面线程同样可以,而且界面线程更直接,可以就在上面的消息循环里处理消息,不象窗口,还写个消息映射。我这点是说的,你只需要窗口来传递消息。
因为一般的控件,必须依靠父窗口而存在,那么这种需求就必须创建一个父窗口,由于窗口和控件都是依靠消息来工作的,所以它们所处的线程必须要有消息循环。那就字节写一个这样的消息循环也是佷简单的。要不从CWinThread派生一个类,然后用AfxBeginThread( RUNTIME_CLASS(...) )来创建界面线程也可以。Top
11 楼happydingdang(我要up出星星)回复于 2005-04-04 15:21:07 得分 0
为什么仅仅是等待的时候也会占用那么多的资源?Top
12 楼happydingdang(我要up出星星)回复于 2005-04-04 15:45:01 得分 0
等待会占用资源吗?就是waitforsingleobject这个语句。Top




