2013-08-11 7 views
1

Существует поток, который использует объект ADO Connection, работает с гнездом (-ами) и реагирует на внешние события с помощью WaitForSigleObject или WaitforMultipleObjects. Нить имеет петлю Endles с 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?

+0

MsgWaitForMultipleObjects звучит так, как вам нужно, хотя трудно быть уверенным, вопрос не содержит деталей. –

ответ

1

Непонятно, какую библиотеку вы используете для сетевых операций с сокетом. В общем, существует два возможных способа работы с сокетами, блокирующими или неблокирующими сокетами. Если вы используете блокирующие сокеты (например, Indy), то, вероятно, рекомендуется использовать отдельный поток для операций сокета. Если вы используете неблокирующие сокеты (например, библиотеку ICS), вы можете использовать функцию MsgWaitForMultipleObjectsEx для синхронизации с флагами QS_ALLINPUT для всех ваших входных событий. Вы можете найти более подробную информацию об этой функции здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx Основное различие MsgWaitForMultipleObjectsEx от WaitforMultipleObjects состоит в том, что сначала можно проснуться не только при сигнале какого-либо объекта, но также и в том случае, когда какое-либо конкретное или любое сообщение было отправлено в очередь. Кажется, это то, что вы спросили.

+3

Собственные собственные компоненты TCLientSocket и TServerSocket компании VCL могут работать как в режимах блокировки, так и без блокировки. –

0

Для записи ProcessMessages - это самый злой бит кода, который когда-либо разрабатывался. Это создаст проблемы, о которых вы просто не можете себе представить.

Существует множество компонентов неблокирующего сокета, поэтому вам не нужно опросить данные, полученные с помощью ICS FP. Возможно, вы захотите попробовать это, чтобы помочь с проблемами сокета.