最近开发了一个小程序,有一个奇怪的现象,有一个edit control里面显示串口接收的数据字符串,点击一个按钮,会发送一个命令然后等待500ms,再发下一个命令,这样发送共5个命令,每发一个命令,串口连接的设备会立即返回响应信息;
null
edit control会实时刷新显示发送和接收的数据;但实际表现是必须动一下鼠标,然后才能发送一个命令,然后把命令和反馈都显示出来。
后来找了半天,才发现问题所在:是延迟等待函数的问题。等待500ms是自己写的一个函数,里面用一个循环,不断判断消耗的时间是否达到500ms,循环体内,为了避免死循环导致的界面假死,把接收和处理消息的函数加进去。
void delay_ms(DWORD msec)void delay_ms(DWORD msec){ DWORD dwStart = GetTickCount(); DWORD dwEnd = 0; do { MSG msg; GetMessage(&msg,NULL,0,0); TranslateMessage(&msg); DispatchMessage(&msg); dwEnd = GetTickCount(); } while((dwEnd – dwStart) <= msec); }
如果界面没有操作,没有产生消息,就会阻塞到GetMessage这里,也就没办法执行后续的操作了。
当时为了快速实现功能,我没有对整个流程调整,直接加了一个定时器,定时器间隔小于500ms,这样定时器会产生消息,让delay函数能不阻塞的运行下去,这样界面能自动刷新了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容