500分! 在线程中动态生成的ClientSocket不触发OnConnect和OnRead事件,怎么办? C++Builder (200分)

  • 主题发起人 小娘皮
  • 开始时间

小娘皮

Unregistered / Unconfirmed
GUEST, unregistred user!
********* C++Builder ****************
在线程的构造函数中生成ClientSocket:
__fastcall TSubTh::TSubTh(bool CreateSuspended)
: TThread(CreateSuspended)
{
//CS在头文件中作为类的全局变量声明
CS = new TClientSocket(0);
CS->ClientType = ctNonBlocking;
CS->OnRead = CSRead;
CS->OnConnect = CSConnect;
CS->Address = "127.0.0.1";
CS->Port = 2020;
}

void __fastcall TSubTh::CSConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ShowMessage("连接成功!");
Socket->SendText("测试");
}
void __fastcall TSubTh::CSRead(TObject *Sender,
TCustomWinSocket *Socket)
{
ShowMessage("读数据!");
}
void __fastcall TSubTh::Execute()
{
CS->Open();
//连接
}
以上代码如果放在主Form里,是没有问题的,但放在线程里则不能触发这两个事件,
而服务器端的OnAccept和OnClientConnect事件是能够触发的,表示连接没有问题。
如果CS->ClientType = ctNonBlocking;改为CS->ClientType = ctBlocking;
则可以触发OnConnect事件,而OnRead事件仍然不能触发。请帮忙。很急,500分。


 
我知道了,呵呵。问题在线程的Execute()事件里,你创建了线程后没有做任何的停留操作
就没了,如果你的CS->ClientType = ctNonBlocking,则CS的连接在瞬时就超时了,所以什么
事件也没触发,而CS->ClientType = ctBlocking会阻塞到连接成功为止,但连接后这个线程
也就不停留了,所以不会触发read。
我把你的Execute改了一下就可以了,你可以根据需要处理一下退出处理。
CS->Open();
//连接
//添加
while (true)
{
Sleep(1000);
Application->ProcessMessages();
}
如果你采用CS->ClientType = ctNonBlocking,则要处理onerror事件,否则很快
就有errorcode == 10061 //连接超时的错误产生了。
void __fastcall test::CSError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
//不处理任何错误
}
 
请在
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1256107
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1256108
取另外300分
 
接受答案了.
 
顶部