Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ожидание одного из событий  (Прочитано 7633 раз)
0 Пользователей и 1 Гость смотрят эту тему.
darkelf
Молодой специалист

no
Offline Offline

« : 21-06-2004 15:40 » 

Добрый день.

Подскажите пожалуйста, как реализовать ожидание одного из группы событий. Под событиями понимаются появление символа на последовательном порте или соединения/данных на одном из сокетов. В Unix это делается обыкновенным select()-ом, с указанием файловых дескрипторов сокетов и последовательного порта. Насколько я понял в Windows нельзя ожидать появления данных при помощи select() на чем ни будь, кроме сокетов. Я попытался обойти эту проблему следующим способом - в отдельном потоке вызывается функция ожидания данных на последовательном порте WaitCommEvent(), однако, когда я пытаюсь вывести данные в HANDLE устройства последовательного порта, на котором этот поток ожидает, из другого потока, второй поток блокируется на функции WriteFile().
Записан
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 22-06-2004 04:39 » 

darkelf, Ожидание группы событий - WaitForMultipleObjects
Вот кусок кода из программы, как раз по поводу Com порта.
Код:
{
OVERLAPPED  osRead = {0};
COMSTAT     csStat;
BYTE        bBuf[8192];
DWORD       dwEvtMask,
dwResult,
            dwError,
    dwCNB = 0,
    dwBytes;
// Создаем событие - изменение состояние Com порта
osRead.hEvent = CreateEvent(NULL, true, false, NULL);
// Массив ссылок на события
HANDLE      Handles[] = {osRead.hEvent, m_ceStop.m_hObject};
for (;;)
{
if (!WaitCommEvent(m_hComPort, &dwEvtMask, &osRead))
{
if (WaitForMultipleObjects(2, Handles, false, INFINITE) == WAIT_OBJECT_0 + 1)
« Последнее редактирование: 28-11-2007 18:38 от Алексей1153++ » Записан

Fatal error C1: Brain expected
darkelf
Молодой специалист

no
Offline Offline

« Ответ #2 : 22-06-2004 05:30 » 

Николай, большое спасибо за ответ, а можно ли при помощи WaitForMultipleObjects() ожидать получение данных/коннект на сокете? и кто такой m_ceStop.m_hObject?
Записан
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-06-2004 09:32 » 

darkelf, если получится сварганить из получения данных событие, то да (попробуй распихать все по разным потокам). m_ceStop - CEvent - событие, возбуждаемое в другом потоке, для остановки текущего.
Записан

Fatal error C1: Brain expected
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 22-06-2004 10:22 » 

darkelf, да, можно.

WSACreateEvent -- создаёшь событие (объект Win32),
WSAEventSelect -- привязываешь событие к некоторому сетевому событию (коннект, прибытие данные, ...) на заданном сокете.

После WSAEventSelect событие будет переходить в состояние signalled, при соответствующих сетевых событиях.

Код:
        WSAEVENT accept_event;

        accept_event = WSACreateEvent();
        if ( WSA_INVALID_EVENT == accept_event )
        {
           // error
        }
        if ( 0!= WSAEventSelect( s, accept_event, FD_ACCEPT ) )
        {
            // error
        }
        // ...
        while ( 1 ) {
            wait_res = WaitForMultipleObjects( 1, & accept_event, FALSE, 500 );
            // ...
        }

Тут есть одна засада.  Как показывает практика, вызов операции с сокетом (accept, например) не всегда сбрасывает событие.  Это приводит к тому, что событие обработано, подключение сделано, но событие висит и WaitForMultipleObjects срабатывает, хотя в сети ничего не происходит.  Это можно побороть, если после операции руками сбрасывать событие WSAResetEvent
Код:
       sock = accept( ... );
        WSAResetEvent( accept_event );
« Последнее редактирование: 28-11-2007 18:38 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
darkelf
Молодой специалист

no
Offline Offline

« Ответ #5 : 22-06-2004 11:38 » 

npak, большое спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines