Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1175628268
МегаПупс
2007-04-03 23:24
2007.04.22
Загрузка случайного файла


2-1175685635
Мимопроходящий
2007-04-04 15:20
2007.04.22
Заварочный чайник


11-1154280166
Vladimir Kladov
2006-07-30 21:22
2007.04.22
Версия 2.37


3-1170519998
SerVit
2007-02-03 19:26
2007.04.22
Ошибка при вставке данных с русскими буквами


15-1175187179
eXPell
2007-03-29 20:52
2007.04.22
Stack-overflow....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский