Как смешивать сокеты, сообщения и события
Существует поток, который использует объект 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
Почти все время поток тратит процессор, спрашивая обо всех трех типах событий. Есть ли способ заставить поток спать, пока не произойдет один из трех типов событий, таких как WaitForMultiplyObjects или GetMessage?
2 ответа
Не ясно, какую библиотеку вы используете для сетевых операций с сокетом. В общем, есть два возможных способа работы с сокетами: блокирующие или неблокирующие. Если вы используете блокирующие сокеты (например, Indy), то, вероятно, будет хорошей идеей использовать отдельный поток для операций с сокетами. Если вы используете неблокирующие сокеты (например, библиотеку ICS), то вы можете использовать функцию MsgWaitForMultipleObjectsEx для синхронизации с флагами QS_ALLINPUT для всех ваших входных событий. Вы можете найти больше информации об этой функции здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx Основное отличие MsgWaitForMultipleObjectsEx от WaitforMultipleObjects заключается в том, что первым Можно проснуться не только когда сигнализируется какой-то объект, но и когда какое-то конкретное или какое-либо сообщение было отправлено в очередь. Кажется, это то, что вы спросили.
Для записи, ProcessMessages - самый злой бит кода, когда-либо разработанный. Это создаст проблемы, подобные которым вы просто не можете себе представить.
Существует целый ряд неблокирующих компонентов сокетов, поэтому вам не нужно опрашивать данные, которые приходит на ум ICS данных (возможно, вы захотите попробовать это, чтобы решить проблемы с сокетами).