Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Delphi 如何混合套接字、消息和事件_Delphi_Sockets_Waitformultipleobjects_Peekmessage - Fatal编程技术网

Delphi 如何混合套接字、消息和事件

Delphi 如何混合套接字、消息和事件,delphi,sockets,waitformultipleobjects,peekmessage,Delphi,Sockets,Waitformultipleobjects,Peekmessage,有一个线程使用ADO连接对象,使用套接字操作,并使用WaitForSigleObject或WaitForMultipleObject对外部事件作出反应。螺纹有一个带有3个动作的端部循环: While PeekMessage(MSG, 0, 0, PM_REMOVE) do ProcessMessages(MSG); //for processing messages of COM system if Socket.CanRead then ... //CanRead is true when

有一个线程使用ADO连接对象,使用套接字操作,并使用WaitForSigleObject或WaitForMultipleObject对外部事件作出反应。螺纹有一个带有3个动作的端部循环:

While PeekMessage(MSG, 0, 0, PM_REMOVE) do ProcessMessages(MSG); //for processing messages of COM system

if Socket.CanRead then ... //CanRead is true when there is data in socket to read

if WaitForSingleObject(fHandle, 0) = WAIT_OBJECT_0 then ... //fHandle is handle of outer event

几乎所有的时间线程都在浪费CPU,询问所有三种类型的事件。有没有办法让线程在三种类型的事件(如WaitForMultiplyObjects或GetMessage)中的一种发生之前一直处于休眠状态?

目前还不清楚使用socket进行网络操作时使用哪种库。一般来说,使用套接字有两种可能的方法,阻塞或非阻塞套接字。如果您使用阻塞套接字(例如Indy),那么使用单独的线程进行套接字操作可能是个好主意。 如果使用非阻塞套接字(如ICS库),则可以使用MsgWaitForMultipleObjectsEx函数与所有输入事件的标志QS_ALLINPUT进行同步。您可以在此处找到有关此功能的更多信息:
MsgWaitForMultipleObjectsEx与WaitforMultipleObjects的主要区别在于,第一个对象不仅可以在向某个对象发送信号时唤醒,还可以在队列中发布某个特定或任何消息时唤醒。这似乎是您所要求的。

不清楚您使用什么样的库进行socket网络操作。一般来说,使用套接字有两种可能的方法,阻塞或非阻塞套接字。如果您使用阻塞套接字(例如Indy),那么使用单独的线程进行套接字操作可能是个好主意。 如果使用非阻塞套接字(如ICS库),则可以使用MsgWaitForMultipleObjectsEx函数与所有输入事件的标志QS_ALLINPUT进行同步。您可以在此处找到有关此功能的更多信息:
MsgWaitForMultipleObjectsEx与WaitforMultipleObjects的主要区别在于,第一个对象不仅可以在向某个对象发送信号时唤醒,还可以在队列中发布某个特定或任何消息时唤醒。看来这正是你所要求的。

请记住,ProcessMessages是迄今为止设计的最邪恶的代码。这会产生你无法想象的问题


有许多非阻塞套接字组件,因此您不必轮询数据(我想到的是FP的ICS),也许您希望尝试使用这些组件来帮助解决套接字问题。

请注意,ProcessMessages是迄今为止设计的最邪恶的代码。这会产生你无法想象的问题


有许多非阻塞插座组件,因此您不必轮询FP的ICS数据),也许您想尝试一下,以帮助解决套接字问题。

VCL自己的原生
TClientSocket
TServerSocket
组件可以在阻塞和非阻塞模式下运行。VCL自己的原生
TClientSocket
TServerSocket
组件可以在阻塞和非阻塞模式下运行非阻塞模式。MsgWaitForMultipleObjects听起来像您需要的,虽然很难确定,但问题缺乏细节。MsgWaitForMultipleObjects听起来像您需要的,尽管很难确定,但问题缺乏细节。