我正在处理客户端服务器应用程序,我需要发送从脚本文件中读取的命令。
脚本文件的格式如下。
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.
遇到Match Command时,程序应等待指定秒的匹配,然后继续执行下一个命令。
我在应用程序中运行了两个线程
现在遇到匹配主线程时应该将匹配字符串发送给 侦听器线程用于匹配并在那里等待来自侦听器线程的信号。
监听器线程将匹配字符串与从服务器接收的数据(如果匹配)将单个事件(SetEvent()窗口)单个主线程,然后主线程将记录“匹配找到”其他方式如果时间被删除然后它将记录为“未找到匹配”
我想到了一个全局变量char * g_MatchString。每当有匹配命令并且等待事件(windows事件)被单独并且等待时间将等于匹配时间时,主线程将更新此变量。
我需要你们的意见,不管我的方法是否正确。
答案 0 :(得分:1)
不要使用全局。当有人在未来增加复杂性时,这只会产生竞争条件的可能性。匹配字符串应作为输入参数传递给线程。您没有说明如何启动该线程,但如果您使用的是_beginthread(),则只需分配一个缓冲区并将其传递给arglist参数中的_beginthread()。当侦听器线程终止时,主线程可以安全地释放匹配字符串缓冲区。如果添加额外的线程,这将使其保持良好的自包含且没有潜在的竞争条件。如果您使用CreateThread()启动线程,则可以通过lpParameter参数传递它。
除了全球,我认为你的方法是合理的。
答案 1 :(得分:0)
由于主线程在侦听器线程上等待,并且侦听器线程的唯一目的是读取入站数据,我建议完全删除侦听器线程并让主线程直接读取。