1

There is a thread that uses ADO Connection object, operates with a socket(s) and reacts on outer events using WaitForSigleObject or WaitforMultipleObjects. The thread has an endles loop with 3 actions:

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

Almost all time the thread wastes CPU asking about all three types of events. Is there way to make thread to sleep until one of three types of events happend, like WaitForMultiplyObjects or GetMessage?

4

2 回答 2

1

目前尚不清楚您使用哪种库进行套接字网络操作。一般来说,有两种可能的方式来使用套接字,阻塞或非阻塞套接字。如果您使用阻塞套接字(例如 Indy),那么使用单独的线程进行套接字操作可能是个好主意。如果您使用非阻塞套接字(如 ICS 库),那么您可以使用 MsgWaitForMultipleObjectsEx 函数与所有输入事件的标志 QS_ALLINPUT 同步。您可以在此处找到有关此功能的更多信息:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx MsgWaitForMultipleObjectsEx 与 WaitforMultipleObjects 的主要区别在于,第一个不仅可以在某个对象发出信号时唤醒,还可以在队列中发布某些特定或任何消息时唤醒。好像是你问的。

于 2013-08-11T20:26:51.960 回答
0

作为记录,ProcessMessages 是有史以来设计的最邪恶的代码。它会产生你根本无法想象的问题。

那里有许多非阻塞套接字组件,因此您不必轮询数据 FP 的 ICS 浮现在脑海中),也许您可​​能想尝试一下以帮助解决您的套接字问题。

于 2013-08-12T02:03:33.227 回答