繁体   English   中英

线程间通讯

[英]InterThread communication

我在客户端服务器应用程序上工作,我需要发送从脚本文件读取的命令。

脚本文件的格式如下。

CONNECT <www.abcd.com,80>
SEND :           AB 40 01 FF 00 00 00 09 01 01 07 00 00 C0 A8 01 87 AE 
MATCH<s,10>:     AB 40 01 FF 00 00 00 09 01 01 07 00 00 C0 A8 01 87 AE
SEND :       AB 34 01 FF00 00 00 0C 01 01 07 00 01 01 07 00 FF FF FF FF AE 
DISCONNECT
note: s in match is wait time in seconds.
here second byte is Msg ID.

当遇到匹配命令时,程序应等待匹配指定的秒数,然后继续执行下一个命令。

我在应用程序中运行了两个线程

  1. 侦听器线程-它将从服务器接收数据。(在此使用select())
    当程序遇到connect命令时将启动它,当该程序遇到时将关闭
    在配置中遇到断开连接。
  2. 主线程将从配置文件中读取命令并执行。

现在,当遇到匹配时,主线程应将匹配字符串发送到侦听器线程进行匹配,然后在那里等待侦听器线程的信号。

侦听器线程会将字符串与从服务器接收到的数据进行匹配(如果匹配),它将把事件(SetEvent()窗口)选到主线程,然后如果时间流逝,主线程将以其他方式记录“找到匹配”,然后它将记录为“未找到匹配项”

我想到了一个全局变量char * g_MatchString。只要有match命令,主线程就会更新此变量,并等待事件(windows event)被选中,并且等待时间等于匹配时间。

无论我的方法是否正确,我都需要你们的意见。

不要使用全局。 当将来有人增加复杂性时,这只会创造出潜在的竞赛条件。 匹配字符串应作为输入参数传递给线程。 您没有说明如何启动线程,但是如果使用_beginthread(),则只需分配一个缓冲区并将其传递给arglist参数中的_beginthread()。 当侦听器线程终止时,主线程可以安全地释放匹配字符串缓冲区。 如果添加了其他线程,这将使其保持良好的独立性,并避免潜在的竞争条件。 如果使用CreateThread()启动线程,则可以通过lpParameter参数将其传递。

除了全球之外,我认为您的做法是正确的。

由于主线程正在等待侦听器线程,并且侦听器线程的唯一目的是读取入站数据,因此建议您完全放弃侦听器线程,然后让主线程直接进行读取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM