首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

对话框中的延时,望!

2012-01-19 
对话框中的延时,望高手指点!!我做的是串口通信,用的是一个串口类。这个类在发送数据时是单独开了一个线程并

对话框中的延时,望高手指点!!
我做的是串口通信,用的是一个串口类。这个类在发送数据时是单独开了一个线程并且是异步IO方式。

Serial.Write(   "Data1 "   )
Sleep(   50   )

Serial.Write(   "Data2 "   )
Sleep(   50   )

Serial.Write(   "Data2 "   )
Sleep(   50   )

用串口监控,数据Data1、Data2、Data3有时候都发送出去,有时候可能只有2个数据发送出去。特别是要读书据时这种方法更不行,因为主线程Sleep时不接收消息响应。后来我就变通了一下自己写了个延时程序:

void   TimeDelay(float   fMillisecond)
{
MSG   msg;
clock_t   delay   =   (   fMillisecond   *   CLOCKS_PER_SEC   )   /   1000;
clock_t   start   =   clock();
while(   clock()   -   start   <   delay   )
{
PeekMessage(   &msg,   this-> m_hWnd,   NULL,   NULL,   PM_REMOVE   );
TranslateMessage(   &msg   );
DispatchMessage(   &msg   );
}
}
这样既可以起到延时的作用,也可以在延时期间接受消息响应。

假设在不考虑接收数据时,如果把上面的Sleep,改成TimeDelay仍然会出现上面的情况:有时候三条数据都发出去了,有时候只有两条,而且成功地概率还不如Sleep来的高。

我目前没办法用的是Timer,用Timer虽然不存在这些问题,但是总觉得不爽,所以希望大家如果有Timer方面的建议就不要提了。


希望高手能够指点一下,谢谢!!

[解决办法]
可以使用考虑使用多线程,主要原因有:
1)如果在主线程中使用sleep()会导致程序主界面假死,CPU占100%而导致其它的任何事情都没有办法处理。
2)在其它线程中处理,只需要提供发送接口就可以,处理的内部实现细节都在串口处理线程中。
3)延时可以有主线程使用定时器发送或者其它,这样会节省很多宝贵的时间。

[解决办法]
最根本的原因肯定在于主线程占用了时间,结果串口子线程没执行到,这点估计比较麻烦。不过,在正常通信过程中,通常发出数据后,对方都会有响应,检查对方的回应对不对就是了。Sleep( 50 )并不可靠。
[解决办法]
为什么这么多人都不知道判断Write函数的返回值?

你提交了串口的IO,操作系统并不能保证将你提交的数据全部发出,这时需要检查返回值
将剩余数据继续发送

假设有个数据
BYTE vData[10];

发送时,应该这样

LPBYTE pData = vData;
int nToSend = sizeof(vData);

int nSended = 0;
for(; nSended < nToSend;)
{
Serial.Write(pData + nSended, nToSend - nSended);
}

这样才能保证你的数据完整发出,Socket通讯也是一样
相当部分人以为只要调用了send函数数据就发出了

[解决办法]
WriteFile等异步IO通讯,可以通过GetOverlappedResult得到IO的lpNumberOfBytesTransferred处理字节数
[解决办法]
既然是异步IO就可以通过GetOverlappedResult得到实际发送的,

热点排行