Delphi 如何混合套接字、消息和事件
有一个线程使用ADO连接对象,使用套接字操作,并使用WaitForSigleObject或WaitForMultipleObject对外部事件作出反应。螺纹有一个带有3个动作的端部循环: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
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听起来像您需要的,尽管很难确定,但问题缺乏细节。