Re[5]: IOCP: GetQueuedCompletionStatus и потоки
От: mLapo  
Дата: 09.08.07 12:34
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, TarasCo, Вы писали:
TC>>Это понятно, но может быть какая то логическая ошибка, типа
MC>Да, там скорее всего автор запутался в последовательностях происходящих событий/вызовов. С его множеством PostQueuedCompletionStatus это неудивительно.
MC>For mLapo: Вообще-то PostQueuedCompletionStatus обычно используется в том случае, когда надо "завернуть" на IOCP нечто, изначально IOCP не поддерживающее. Например, у тебя уже есть некий черный ящик, который уведомляет о происходящем через какие-нибудь callback'и. Ты не хочешь для него плодить отдельных потоков, а хочешь чтобы уведомления от него обрабатывались в пуле потоков-обработчиков IOCP. Тогда и стОит использовать PostQueuedCompletionStatus. Частный случай такого черного ящика — команды SCM Windows-сервису.

Во-первых, спасибо вам за конструктивный диалог. C IOCP не работал раньше, может где-то и туплю.
Переписал код, сделав ненужными PostQueuedCompletionStatus.
Вначале была такая схема.
Мне нужно отправить данные:
1) В рабочем потоке создаю OverlapBuff с пометкой "IWrite".
2) В рабочем потоке вызываю PostQueuedCompletionStatus передав туда сокет, который хочет отправить и pOverlapBuff
3) В потоке IOCP отлавливаю IWrite, достаю из прараметров GetQueuedCompletionStatus сокет, после чего вызываю WSASend с необходимыми параметрами среди которых и "новый" рOverlapBuff, но уже с пометкой "IWriteComplete".
4) по получению IWriteComplete некоторым образом обновляю буфер сокета.

С получением в принципе все тоже самое, только после получения данных я снова иницирую чтение вызвав WSARead

pOverlapBuff->SetOperation(IOReadCompleted);
pOverlapBuff->SetupRead((char*)pSocket->ReadBuffer()->get_buffer() + pSocket->ReadBuffer()->get_data_size(), pSocket->ReadBuffer()->get_free_size());
uint32 dwIoSize = 0;
uint32 ulFlags = MSG_PARTIAL;
if(::WSARecv(pSocket->GetSocket(), pOverlapBuff->GetWSABuffer(), 1, &dwIoSize,  &ulFlags, &pOverlapBuff->m_ol, NULL) == SOCKET_ERROR


Переписал.
Теперь при желании отправить данные, буду сразу слать и ждать нотификации об успешной отправке. С получение тоже самое. Без PostQueuedCompletionStatus. Буду тестировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.