各位高手,请教下在循环中等待事件响应的问题,谢谢?

木奇 2013-09-07 04:46:14
各位高手,请教下想要实现给下位机发送命令,在规定时间内等待接收命令,请问怎样实现比较好,谢谢?
下面用Application->ProcessMessages()响应会不会有问题,有没有别的比较好的方法,谢谢!

//发送命令
void __fastcall TForm_Main::Button_SendClick(TObject *Sender)
{
……
发送命令

//等待接收命令
DWORD Time_RecvStart=GetTickCount();
Recv_Confirm==RECV_CMD_FAIL;
Send_OK=false;
do
{
Application->ProcessMessages();

//判断接收确认信号
if(Recv_Confirm==RECV_CMD_OK)
{
Send_OK=true;
break;
}

}while((GetTickCount()-Time_RecvStart)<RECV_DELAY);

//后续处理
……
}

//接收命令
void __fastcall TForm_Main::ServerSocket_SCMClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
//接收命令处理
……

if(是接收确认命令)
{
Recv_Confirm==RECV_CMD_OK
}

……
}
...全文
204 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
木奇 2013-09-13
  • 打赏
  • 举报
回复
太复杂了,有没有简单点的方法啊,谢谢了
木奇 2013-09-11
  • 打赏
  • 举报
回复
哎,越来越复杂了,真是有点迷糊了
青蛙工作室 2013-09-11
  • 打赏
  • 举报
回复
只是一个过程而已,哪有什么线程安全的问题,除非你在多个线程中都有可能执行ServerSocket_SCMClient而且该过程会改变公共变量才应该考虑线程安全。
如果ServerSocket_SCMClient本身还负有别的任务,那就另建个子过程去处理接收命令,创建个子线程去执行该子过程就可以了。
木奇 2013-09-10
  • 打赏
  • 举报
回复
引用 4 楼 xinhunter 的回复:
接受命令放在线程中。从你的代码看,在接收过程中只有一个标志性公共变量RECV_CMD_OK会被改变,而且这个变量在别的子过程中是只读的,所以不用担心线程冲突。 或者更干脆点,在Button_SendClick过程中发送命令之后就启动子线程并结束自身过程,而do ...while则全部移入子线程,在子线程中去循环接收,这样在子线程中Sleep(20)也就不用担心程序反应慢。
再请教下: 1)变量倒是没大问题,就是担心ServerSocket_SCMClient是不是线程安全的,会不会跑着跑着就出错啊,还有ServerSocket_SCMClient不光接收确认命令,还要接收其他数据命令,是整体都放在线程,还是单独的接收确认命令放在线程? 2)在Button_SendClick过程中发送命令之后就启动子线程并结束自身过程——可是要在发送命令后要根据接收命令是否正确,分别进行不同的处理,在Button_SendClick过程中发送命令之后就启动子线程并结束自身过程,就没办法处理了? 谢谢!
青蛙工作室 2013-09-10
  • 打赏
  • 举报
回复
接受命令放在线程中。从你的代码看,在接收过程中只有一个标志性公共变量RECV_CMD_OK会被改变,而且这个变量在别的子过程中是只读的,所以不用担心线程冲突。 或者更干脆点,在Button_SendClick过程中发送命令之后就启动子线程并结束自身过程,而do ...while则全部移入子线程,在子线程中去循环接收,这样在子线程中Sleep(20)也就不用担心程序反应慢。
木奇 2013-09-09
  • 打赏
  • 举报
回复
引用 2 楼 xinhunter 的回复:
把“接收命令”写在一个子线程,在等待的过程中可以添加Sleep(20)什么的,降低CPU的占用率。 另外,Recv_Confirm==RECV_CMD_FAIL; 和接收命令的 Recv_Confirm==RECV_CMD_OK语句是不是写多了个=号了。
再请教下: 1)接受命令写在子线程有点不太懂,是将ServerSocket_SCMClientRead的ServerType修改成stThreadBlocking,还是接受命令放在线程中,如果是后者,有没有VCL同步线程的问题啊,谢谢! 2)等待过程在主程序中,加Sleep(20)整个程序都会暂停吧? 3)不好意思,粘贴错了,多写了等号,多谢指正!
青蛙工作室 2013-09-09
  • 打赏
  • 举报
回复
把“接收命令”写在一个子线程,在等待的过程中可以添加Sleep(20)什么的,降低CPU的占用率。 另外,Recv_Confirm==RECV_CMD_FAIL; 和接收命令的 Recv_Confirm==RECV_CMD_OK语句是不是写多了个=号了。
木奇 2013-09-07
  • 打赏
  • 举报
回复
各位高手,求指教,谢谢

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧