对话框中的延时,望高手指点!!
我做的是串口通信,用的是一个串口类。这个类在发送数据时是单独开了一个线程并且是异步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得到实际发送的,