Всех приветствую. есть в программе один поток такого вида Код (Text): DWORD WINAPI ReadStream(PVOID pContext) { for (;;) { recv //... //...processing... } return STATUS_SUCCESS; } это вторичный поток когда первичный получает сообщение WM_DESTROY как корректно завершить этот вторичный не через TerminateThread а чтоб он вышел сам из блокирующей операции чтения и корректно завершился вернув управление ?
послать ему сигнал: флаг в ячейке или использовать какой-нибудь ивент, который поток должен проверять.
shoo в том то и дело что мне его надо завершить когда он блокируется на операции чтения именно в этот момент может придти WM_DESTROY а так как он блокирован на операции чтения нет возможности проверить флаг в ячейке или какой нибудь евент
osox, закрой сокет из главного потока, recv вернёт -1 и WSAGetLastError() == WSAENOTSOCK. Правда, не знаю, насколько это правильно. Раньше когда-то делал так, но давно уже блокирующего ничего не писал.
Всем спасибо за ответы. прежде чем задать вопрос думал про nonblockedIO но лень было переделывать довольно много кода видимо придется
переписал (прошел месяц...) общая схема теперь такая Код (Text): VOID CALLBACK MainReadStreamExitApcRoutine(ULONG_PTR dwParam) { } DWORD WINAPI ReadStream(PVOID pContext) { // ...make event with socket WSAEventSelect(..., Event, FD_READ); for (;;) { // ...wait new read event WSAWaitForMultipleEvents(1, &Event, FALSE, WSA_INFINITE, TRUE); if (WSA_WAIT_IO_COMPLETION == Code) break; // fake apc routine has been executed jmp to exit // ...lookup what event occured WSAEnumNetworkEvents(..., Event, &wEv); if (wEv.lNetworkEvents & FD_READ) { recv //... //...processing... } continue; } return STATUS_SUCCESS; } когда приняли решение о завершении поток проснется выполнит апк и завершится Код (Text): QueueUserAPC(MainReadStreamExitApcRoutine, hReadInputStreamThread, 0);