Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
ВнизОпределение последнего вызова "колбэка" BindIoCompletionCallback Найти похожие ветки
← →
Riply © (2007-04-04 11:19) [0]Здравствуйте !
Допустим, мы пытаемся сделать что-то вроде:
var
hDevice: THandle;
OverLapCallBack: LPOVERLAPPED_COMPLETION_ROUTINE;
////////////
BindIoCompletionCallback(hDevice, OverLapCallBack, 0);
////////////
Теперь нам надо остановить работу.
CloseHandle(hDevice);
Мечта: дожидаемся события "последнего вызова" OverLapCallBack.
Дождавшись, выполняем какие-то действия, несовместимы с вызовом OverLapCallBack.
Как это можно реализовать ?
Счетчик запросов\ответов... - не факт, что при таком закрытии их значения будут совпадать.
Анализ ошибки в OverLapCallBack (например, ждать что нибудь типа INVALID_HANDLE),
можно и не дождаться (перестанет вызываться по другой причине)
← →
Сергей М. © (2007-04-04 11:46) [1]Вот ты который раз уже мусолишь этот вопрос, а воз и ныне там)
При этом я в который раз задаю тебе вопрос, чем тебе не угодила колбэк-схема с MsgWaitForMultipleObjectEx+Read/WriteFileEx ? Зачем усложнять себе жизнь, если все решается гораздо проще, понятней и изящней ?
← →
Riply © (2007-04-04 12:08) [2]>[1] Сергей М. © (04.04.07 11:46)
Привет ! А я там ответила:
>[17] Riply © (30.03.07 17:51)
>(если конесно я все правильно понимаю)
>в MsgWaitForMultipleObjectEx, все равно, придется обходить ограничение MAXIMUM_WAIT_OBJECTS.
>И снова наши взоры устремяться к RegisterWaitForSingleObject, либо созданию "ждущего" пула вручную.
Ты, наверное, просто не видел.
Да и потом с RegisterWaitForSingleObject у меня уже все работает "на ура" (тьфу - тьфу)
Нитей в сервере - кот наплакал :)
Теперь хочу разобраться с BindIoCompletionCallback. Если удасться справиться с неувязочками типа САБЖА,
то код получиться такой маленький, прозрачный и красивый - аж просто загляденье ! :)
← →
Сергей М. © (2007-04-04 12:20) [3]
> придется обходить ограничение MAXIMUM_WAIT_OBJECTS
Не надо обходить никакие ограничения, MsgWaitForMultipleObjectEx нужен лишь для перевода тек.потока в alertable-состояние - только в этом состоянии будут вызываться колбэки. В кач-ве объекта ожидания (или нескольких объектов ожидания) можно указать любое допустимое кол-во хэндлов, даже не имеющих отношения к ивентам в составе overlapped-структур - функция возвратит управление, как только будет выполнен первый же колбэк в очереди колбэков.
Почитай внимательно справку к MsgWaitForMultipleObject и FileIOCompletionRoutine (см. Read/WriteFileEx)
← →
Riply © (2007-04-04 12:41) [4]>[3] Сергей М. © (04.04.07 12:20)
Ты, наверное, на MsgWaitForMultipleObjectEx
уже собаку съел, раз так настойчиво советуешь ?
Придется последовать совету и проверить:
так ли все сладко, как ты расписываешь :)
P.S.
А сабжевый вопрос, мне все равно интересен.
Надо же раз и навсегда разобраться с семейством этих функций.
← →
Сергей М. © (2007-04-04 12:46) [5]В кач-ве иллюстрации :
MAX_CLIENTS = 65536;
var
i: Integer;
povl: POverlapped;
ovl_array: array[0..MAX_CLIENTS-1] of TOverlapped;
procedure ReadCallback(ErrCode, BytesRead: DWord; AOvl: POverlapped); stdcall;
begin
povl := AOvl; //фиксируем данные о клиентском пайпе, завершившем операцию
end;
..
hEvent := CreateEvent(..); //фиктивный ивент для подстановки в ф-цию ожидания
...
for i := 0 to MAX_CLIENTS - 1 do begin
ovl_array[i].hEvent := i; //поле hEvent идентифицирует пайп
ReadFileEx(hPipes[i], .., @ovl_array[i], @ReadCallback);
end;
..
case MsgWaitForMultipleObjectsEx(1, hEvent, False, INFINITE, True) of
WAIT_IO_COMPLETION: ShowMessage(IntToStr(povl.hEvent));
WAIT_OBJECT_0+1: ... обрабатываем сообщения тек.потоку или его окнам ..
end;
← →
Riply © (2007-04-04 13:40) [6]> [5] Сергей М. © (04.04.07 12:46)
Спасибо.
← →
Сергей М. © (2007-04-04 13:42) [7]
> Riply © (04.04.07 13:40) [6]
Ну ?
Оценила что ли ?)
И каковО резюме ?)
← →
Riply © (2007-04-04 13:47) [8]> [7] Сергей М. © (04.04.07 13:42)
>И каковО резюме ?)
Резюме выдам, когда набросаю скелет сервера и прогоню его пару раз.
Но внешне, выглядит также сладко, как ты и обещал :)
← →
Сергей М. © (2007-04-04 13:52) [9]
> Riply © (04.04.07 13:47) [8]
"Сладостей" я тебе не обещал).. Да ты и не просила)
Я лишь показал тебе один из напростейших и довольно, imho, изящных способов избавления от геморроя с упомянутым ограничением
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c