ClientSocket放在线程中连接DOS下位机的问题。(300分)

  • 主题发起人 主题发起人 skyjacker
  • 开始时间 开始时间
S

skyjacker

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientSocket放在线程(Tthread)中,连接DOS下位机,只能正常连接一次。

一次连接成功以后,ClientSocket再也连不上下位机了。而下位机显示已经建立了连接,

但是ClientSocket的OnConnect事件也没有触发。



不用线程执行一切正常。但有以下问题:

打开其他窗体之后,再让有ClientSocket的窗体再自动执行连接下位机,

其他窗体就不能关闭了。



如果先执行ClientSocket连接,就可以操作其他窗体了。

头大了:(
 
连接WindowXP上的下位机测试程序正常.

现在有点怀疑ClientSocket在线程中与dos建立连接方面有问题.

第一次连接DOs下位机正常通讯,之后就不行了.
ClientSocket也执行了socket.close;


不明白线程为什么能够影响ClientSocket.
 
ClientSocket的OnConnect等事件是建立在windows消息的基础上的,线程中无法响应消息,所以不出发OnConnect事件。
如果熟悉winsock api的话可以考虑使用WSAEventSelect模型,他靠事件驱动,和windows消息无关。
 
"线程中无法响应消息" 第一次连接成功如何解释?
 
第一次连接是成功的,你从下位机不是已经看到连接建立了么。只不过你的程序没有收的连接建立的消息。

“一次连接成功以后,ClientSocket再也连不上下位机了”这个更好理解了,因为第一次connect成功,所以这个套接字是打开的,在你没有关闭他之前,你再次connect当然不会成功
 
Maze说的是, 在线程内最好是Select或事件选择模型,可能VCL那套Socket不适合这样应用。
DOS下位机是做什么的,没用过?
 
是我没表达清楚.


我说在线程中第一次连接成功是指 ClientSocket 连接成功,OnConnect也触发了,并且发送和接收数据完毕.并且在窗体上显示相关信息,线程结束.关闭窗体(form1.hide).


然后再打开窗体form1.show,创建线程,连接此dos下位机时就连接不成功了.下位机显示已经建立了连接,但ClientSocket的OnConnect没有触发,同样ClientSocket.active为false.

不知道明白了没有?



DOS下位机是用来收集数据,并且上报给上位机.

我上面说的功能其实是上位机巡检下位机,发送上位机的时间给下位机.

因为下位机有多台,因此用ClientSocket连接一台结束后,就关闭.

再去连接下一台下位机.
 
多人接受答案了。
 
后退
顶部