大侠帮忙!!!(100分)

  • 主题发起人 主题发起人 牛龙
  • 开始时间 开始时间

牛龙

Unregistered / Unconfirmed
GUEST, unregistred user!
form1中有clientsocket控件,我用一个线程设置它的port和host(由于程序需要所以用一个线程来设置),但是当我在线程中执行open方法后。form1中的clientsocket控件只有onconnecting消息产生,onconnect消息却没有触发。(但是clientsocket与serversocket确确实实已经建立了联接。)这是为什么?????
此问题已经困扰我好几天了,请大侠帮忙给解决一下!!!!
谢谢!!!
 
真的已经建立连接吗?
你是怎么知道的?
 
我当然还有一个服务器程序了,当我在线程中执行open后,服务器程序的onaccept、onconnect等消息都执行了,并且当我的客户端close后服务器端的ondisconnet消息也会执行!!
 

1.试一试,从serversocket发几个字节给client ,看是不是能收到.
如果能收到,问题解决,可以让server先"提示",client在收到后发送数据.
这个办法治标不治本,只能是情况紧急,先用着再说.

2.看看这个线程式不是被挂掉了?在主程序里处理循环时多用processmessage
试试.

3.用NetXray监视,看看是不是真的握手成功.
 
Hehe, 为了进一步回答关于DELPHI的问题, 咱只好安装了一套
DELPHI, :)
根据我的测试, 使用另一个线程设置Form中的ClientSocket的Port
和Host, 然后Open, 结果ClientSocket的事件生成出了问题, 正常
情况下, 应该是 onLookup, onConnecting, onConnect, onWrite,
onRead等等
可是用了另一个线程后, 事件成了: onLookup, onLookup,
onConnecting, onConnecting, 然后就出错了
看来ClientSocket之类的异步事件处理控件不能这样用.
我后来用另一个线程产生了一个新的Form, 在该Form中调用对另
一个Form中的ClientSocket控件的属性赋值, 然后Open, 就再也不
会出错啦!
不知道您为什么需要在另一个线程中直接操作Form中的控件呢?
最好是给这个Form发送消息, 由Form自己来处理
 
这个问题我已经知道是为什么了.由于winsocket控件在form中.所以只有在
线程的Synchronize函数里设置winsocket控件才行.
 
Ohh, I see,
如果有可能发生多线程冲突时, 可以把可能产生冲突的代码
做成过程让Synchronize函数调用, 他会确保在Main VCL Thread里
执行, 但这样做首先不易传递参数, 其次, 我觉得还不如干脆
给相应的Form发送消息更好. 另外, 这样做时, 调用Synchronize的
线程也回悬挂在那里等待, 似乎体现不出多线程的好处, :(
 
使用Synchronize函数是能够防止数据冲突,大会市代码尽量减少,而且使用Synchronize特别要防止死锁,而且不是所有的VCL都是线程安全的。
 

Similar threads

D
回复
0
查看
810
DelphiTeacher的专栏
D
D
回复
0
查看
757
DelphiTeacher的专栏
D
D
回复
0
查看
707
DelphiTeacher的专栏
D
后退
顶部