Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在非阻塞模式下在TThread内使用TClientSocket时未触发OnConnect事件 我试图在多线程C++窗口应用程序中使用Borland TclicliStuts组件,在非阻塞模式下使用。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我分配线程类的成员函数作为套接字的OnConnect、OnDisconnect和OnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TThread::Execute()函数中调用TClientSocket::Open()函数时,OnConnect事件永远不会触发。但是,在调用TThread::Execute()函数之前,当我从VCL线程调用Open()函数时,所有事件都会触发,我可以按照自己的意愿使用线程套接字组合。现在,我还没有读过文档中的任何内容,说明在线程内部使用时,TClientSocket不应在非阻塞模式下使用,但在我看来,我尝试使用此类的方式在概念上可能存在错误。Borland在这方面的文档非常差,这些组件现在已经被弃用,因此很难获得可靠的信息。尽管不推荐使用,但我还是不得不使用它们,因为在我的Builder6软件包中没有其他选择。有谁能告诉我在组合使用TThread和非阻塞TClientSocket时是否有正确/错误的方法。我在使用它作为VCL线程的一部分时从来没有遇到过问题,在使用TServerSocket之前也从来没有遇到过问题,我真的无法理解为什么一些事件没有触发。_C++_C++builder_Tthread_Tclientsocket - Fatal编程技术网

在非阻塞模式下在TThread内使用TClientSocket时未触发OnConnect事件 我试图在多线程C++窗口应用程序中使用Borland TclicliStuts组件,在非阻塞模式下使用。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我分配线程类的成员函数作为套接字的OnConnect、OnDisconnect和OnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TThread::Execute()函数中调用TClientSocket::Open()函数时,OnConnect事件永远不会触发。但是,在调用TThread::Execute()函数之前,当我从VCL线程调用Open()函数时,所有事件都会触发,我可以按照自己的意愿使用线程套接字组合。现在,我还没有读过文档中的任何内容,说明在线程内部使用时,TClientSocket不应在非阻塞模式下使用,但在我看来,我尝试使用此类的方式在概念上可能存在错误。Borland在这方面的文档非常差,这些组件现在已经被弃用,因此很难获得可靠的信息。尽管不推荐使用,但我还是不得不使用它们,因为在我的Builder6软件包中没有其他选择。有谁能告诉我在组合使用TThread和非阻塞TClientSocket时是否有正确/错误的方法。我在使用它作为VCL线程的一部分时从来没有遇到过问题,在使用TServerSocket之前也从来没有遇到过问题,我真的无法理解为什么一些事件没有触发。

在非阻塞模式下在TThread内使用TClientSocket时未触发OnConnect事件 我试图在多线程C++窗口应用程序中使用Borland TclicliStuts组件,在非阻塞模式下使用。我正在创建多个线程(从TThread派生的类),每个线程都创建自己的TClientSocket对象。然后,我分配线程类的成员函数作为套接字的OnConnect、OnDisconnect和OnSocketError事件的事件处理程序。我在这里遇到的问题是,每当我从TThread::Execute()函数中调用TClientSocket::Open()函数时,OnConnect事件永远不会触发。但是,在调用TThread::Execute()函数之前,当我从VCL线程调用Open()函数时,所有事件都会触发,我可以按照自己的意愿使用线程套接字组合。现在,我还没有读过文档中的任何内容,说明在线程内部使用时,TClientSocket不应在非阻塞模式下使用,但在我看来,我尝试使用此类的方式在概念上可能存在错误。Borland在这方面的文档非常差,这些组件现在已经被弃用,因此很难获得可靠的信息。尽管不推荐使用,但我还是不得不使用它们,因为在我的Builder6软件包中没有其他选择。有谁能告诉我在组合使用TThread和非阻塞TClientSocket时是否有正确/错误的方法。我在使用它作为VCL线程的一部分时从来没有遇到过问题,在使用TServerSocket之前也从来没有遇到过问题,我真的无法理解为什么一些事件没有触发。,c++,c++builder,tthread,tclientsocket,C++,C++builder,Tthread,Tclientsocket,TClientSocket在非阻塞模式下在内部使用隐藏窗口来接收套接字事件。如果在TThread中使用非阻塞TClientSocket,则必须在TThread::Execute()方法中实现消息循环,以便将这些消息分派到套接字窗口。另外,由于基于窗口,这也意味着套接字消息被发送到实际创建套接字窗口的线程,因此必须确保从TThread::Execute()方法内部打开TClientSocket 顺便说一句,BCB6与Indy 8一起装运,Indy 8是一种替代品。您还可以安装最新版本的Indy,甚

TClientSocket
在非阻塞模式下在内部使用隐藏窗口来接收套接字事件。如果在
TThread
中使用非阻塞
TClientSocket
,则必须在
TThread::Execute()
方法中实现消息循环,以便将这些消息分派到套接字窗口。另外,由于基于窗口,这也意味着套接字消息被发送到实际创建套接字窗口的线程,因此必须确保从
TThread::Execute()
方法内部打开
TClientSocket


顺便说一句,BCB6与Indy 8一起装运,Indy 8是一种替代品。您还可以安装最新版本的Indy,甚至是ICS或Synapse等第三方库。

感谢您的回答,这非常有帮助。将主
TApplication
指针传递到我的线程类并从
Execute()
定期调用该指针上的
ProcessMessages()
就足够了吗?还是我必须明确使用
GetMessage()
DispatchMessage()
?不要使用
ProcessMessages()
,a
GetMessage()
/
DispatchMessage()
循环是可以的。或者在阻塞模式下使用
TClientSocket
,这样您就不必担心消息了。