我正在处理客户机服务器应用程序,在那里我需要发送从脚本文件读取的命令。
脚本文件的格式如下。
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.当遇到匹配命令时,程序应该等待指定的第二次匹配,然后继续执行下一个命令。
我在应用程序中运行了两个线程。
它将在程序遇到connect命令时启动,并在
在配置中遇到断开连接。
现在,当匹配遇到时,主线程应该将匹配字符串发送到侦听器线程进行匹配,然后在那里等待来自侦听器线程的信号。
侦听器线程将将字符串与从服务器接收的数据匹配,如果匹配,则将事件(SetEvent() windows)单个到主线程,然后主线程将记录“找到的匹配”(如果时间被缩短,则将记录为“匹配未找到”)。
我想让一个全局变量char* g_MatchString.The主线程在有match命令的时候更新这个变量,然后等待事件(windows事件)被单身,等待时间等于匹配时间。
我需要你们的意见,不管我的方法是否正确。
发布于 2011-09-07 22:57:13
不要使用全局的。这只是创造了潜在的种族条件时,有人增加了复杂性在未来。匹配字符串应作为输入参数传递给线程。您没有说明如何启动线程,但是如果使用_beginthread(),只需分配一个缓冲区并将其传递给arglist参数中的_beginthread()。当侦听器线程终止时,主线程可以安全地释放匹配字符串缓冲区。如果添加了额外的线程,这将保持它很好地自我包含,并且不受潜在的竞争条件的影响。如果使用CreateThread()启动线程,则将通过lpParameter参数传递它。
除了全球范围外,我认为你的做法是合理的。
发布于 2011-09-05 07:39:42
由于主线程正在等待侦听器线程,而侦听器线程的唯一目的是读取入站数据,所以我建议完全摆脱侦听器线程,让主线程直接进行读取。
https://stackoverflow.com/questions/7304186
复制相似问题