疑惑:在线程中设置主进程ClientSocket->Active = true出现奇怪现像(详情请进)
目的是做一个局域网消息收发程序,在主窗体FormMain添加控件ServerSocket和ClientSockete,均为非阻塞。为实现程序启动时自动将已在线用户(即已运行该程序)添加到用户列表,以及已在线用户将新上线用户添加到用户列表,我定义了一个函数void SearchIP(),程序启动时执行,其中有一个循环用来尝试子网中的每台PC:
do{
...
FormMain->ClientSocket->Address = "xxx.xxx.xxx.xxx"; //各台PC
FormMain->ClientSocket->Active = true;
FormMain->ClientSocket->Active = false;
...
}while (...);
现在本机运行该程序,如果被搜索的远程PC已运行该程序,则该远程PC产生ServerSocketAccept事件,在该事件中将向它连接的PC的IP(即本机IP)添入列表,这实现了已在线用户将新上线用户添加到用户列表;在远程PC产生该事件的同时,本机触发ClientSocketConnect事件,同样在该事件中将远程PC的IP加入列表,实现了用户启动程序时将已在线用户加入列表的功能。
或许你已经看出问题了,的确,在循环进行的时候,如果产生Socket事件便要出错,于是我将该搜索函数放入一个独立线程中,好,这个问题是解决了,但奇怪的是本机不再触发ClientSocketConnect事件,而远程PC的确已经产生了ServerSocketAccept事件!
我归纳一下问题,即:本机在线程中设置FormMain->ClientSocket->Active = true; 这时远程PC的ServerSocket产生ServerSocketAccept事件,但本机不触发ClientSocketConnect事件。生成线程我用的是:
HANDLE hThread = CreateThread(NULL, // default security attributes
0, // use default stack size
SearchIP, // thread function
&dwThrdParam, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
各位帮忙给试试,我 用的是CB5.0 + Win2k