关于CSerialPort与对话框的奇怪问题?
我做了一个串口通信程序,用的是CSerialPort类。
m_SerDevice.InitializeDevice( this, 1, 38400 );
if( m_SerDevice.IsDeviceOpen() )
{
m_SerDevice.StartMonitoring();
}}
MessageBox( "TEST " );
m_SerDevice.SendData( Data1 );
m_SerDevice.SendData( Data2 );
m_SerDevice.SendData( Data3 );
如果我把中间的MessageBox( "TEST ")去掉,则只发送Data3,如果加上则完全发送。
m_SerDevice对象在调用InitializeDevice时会自动创建一个线程。
我个人感觉,在不加MessageBox( "TEST ")时,是这个串口通讯对象还没来得及发送数据,当弹出MessageBox( "TEST ")时,由于主线程的暂停,通讯线程有足够的时间来发送数据。但是如果真这样的话,我把MessageBox( "TEST ")用Sleep( 3000 )来代替,仍然不行,实在是搞不明白,麻烦大家指点一下。
谢谢!!
[解决办法]
使用sleep函数的不利只处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,利用ColeDateTime类和ColeDateTimeSpan类实现延时:
ColeDateTime start_time = ColeDateTime::GetCurrentTime();
ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() <= 2)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
PreTranslateMessage(&msg);
End_time = ColeDateTime::GetCurrentTime-start_time;
}
这样在延时的时候我们也能够处理其他的消息。
--------------------------------------------
这样可以处理消息,不过循环太厉害了,占cpu太多,所以必要时候,还得加Sleep(50)
这样比较好
While(end_time.GetTotalSeconds() <= 2)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
PreTranslateMessage(&msg);
Sleep(50);
End_time = ColeDateTime::GetCurrentTime-start_time;
}
不会太消耗Cpu