疑惑:在线程中设置主进程ClientSocket->Active = true出现奇怪现像(详情请进)

jiansee 2002-08-02 12:34:04
目的是做一个局域网消息收发程序,在主窗体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
...全文
97 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiansee 2002-08-04
  • 打赏
  • 举报
回复
非常感谢jishiping 和 BCB,这个概念性问题我想以后不会再搞错了:)
yangguo_god 2002-08-02
  • 打赏
  • 举报
回复
学习
e_cat 2002-08-02
  • 打赏
  • 举报
回复
Agree jishiping(JSP 季世平) !
BCB 2002-08-02
  • 打赏
  • 举报
回复
do{
...
FormMain->ClientSocket->Address = "xxx.xxx.xxx.xxx"; //各台PC
FormMain->ClientSocket->Open(); // 这样更好

Application->ProcessMessages(); // 响应消息

FormMain->ClientSocket->Close(); // 这样更好
...
}while (...);
再试试看
gfh21cn 2002-08-02
  • 打赏
  • 举报
回复
你连接成功后就立即释放(FALSE)
是不是这个原因
jishiping 2002-08-02
  • 打赏
  • 举报
回复
因为ClientSockete为非阻塞,是消息驱动的。在子线程里,连接成功时,产
生的消息是在子线程的消息队列里,而在子线程里,你又没有响应消息。在设
计时,你产生的那些事件函数,那是在主线程里。每个线程,使用不同的消息
队列,子线程的消息,主线程是收不到的。所以不触发ClientSocketConnect
事件。世纪上,你的写法已经违背了Socket的写法。如果ClientSockete是非
阻塞的,那么操作ClientSockete的所有的代码应该在主线程里。如果你想用
另外一个线程来操作ClientSockete,那么ClientSockete的类型就应该是线程
阻塞型的。阻塞型和非阻塞型,写法是不一样的。
gfh21cn 2002-08-02
  • 打赏
  • 举报
回复
关注
三杯倒 2002-08-02
  • 打赏
  • 举报
回复
up

13,825

社区成员

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

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