Корректно завершить поток

Тема в разделе "WASM.WIN32", создана пользователем osox, 1 июн 2010.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Всех приветствую.
    есть в программе один поток такого вида
    Код (Text):
    1. DWORD WINAPI ReadStream(PVOID pContext)
    2. {
    3.     for (;;)
    4.     {
    5.         recv //...
    6.         //...processing...
    7.     }
    8.     return STATUS_SUCCESS;
    9. }
    это вторичный поток когда первичный получает сообщение
    WM_DESTROY как корректно завершить этот вторичный не через TerminateThread а чтоб он вышел сам из блокирующей операции чтения и корректно завершился вернув управление ?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    послать ему сигнал: флаг в ячейке или использовать какой-нибудь ивент, который поток должен проверять.
     
  3. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    shoo
    в том то и дело что мне его надо завершить когда он блокируется на операции чтения именно в этот момент может придти WM_DESTROY а так как он блокирован на операции чтения нет возможности проверить флаг в ячейке или какой нибудь евент
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    osox
    мож на nonblockedIO переделать? ( проверить приход данных, флаг завершения, поспать и заново)
     
  5. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    osox, закрой сокет из главного потока, recv вернёт -1 и WSAGetLastError() == WSAENOTSOCK. Правда, не знаю, насколько это правильно. Раньше когда-то делал так, но давно уже блокирующего ничего не писал.
     
  6. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    асинхронный ввод-вывод + ожидание на нескольких событиях ( WaitForMultipleObjects(Ex))
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Всем спасибо за ответы.
    прежде чем задать вопрос думал про nonblockedIO но лень было переделывать довольно много кода видимо придется :)
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    переписал (прошел месяц...) общая схема теперь такая
    Код (Text):
    1. VOID CALLBACK
    2. MainReadStreamExitApcRoutine(ULONG_PTR dwParam)
    3. {
    4. }
    5.  
    6. DWORD WINAPI ReadStream(PVOID pContext)
    7. {
    8.     // ...make event with socket
    9.     WSAEventSelect(..., Event, FD_READ);
    10.     for (;;)
    11.     {
    12.         // ...wait new read event
    13.         WSAWaitForMultipleEvents(1, &Event, FALSE, WSA_INFINITE, TRUE);
    14.        
    15.         if (WSA_WAIT_IO_COMPLETION == Code)
    16.             break; // fake apc routine has been executed jmp to exit
    17.        
    18.         // ...lookup what event occured
    19.         WSAEnumNetworkEvents(..., Event, &wEv);
    20.         if (wEv.lNetworkEvents & FD_READ)
    21.         {
    22.             recv //...
    23.             //...processing...
    24.         }
    25.         continue;
    26.     }
    27.    
    28.     return STATUS_SUCCESS;
    29. }
    когда приняли решение о завершении поток проснется выполнит апк и завершится
    Код (Text):
    1. QueueUserAPC(MainReadStreamExitApcRoutine, hReadInputStreamThread, 0);