Главная страница
    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-1175260650
Greenchel
2007-03-30 17:17
2007.04.22
http, ftp и т.д.


15-1175241462
Ketmar
2007-03-30 11:57
2007.04.22
wine и шрифты


2-1175316917
Roman_S
2007-03-31 08:55
2007.04.22
Складной? Label


15-1175004987
oldman
2007-03-27 18:16
2007.04.22
Яндекс ответа не дает, прошу туда не посылать...


2-1175055373
npu3pak
2007-03-28 08:16
2007.04.22
Как добавить новые строки в базу на accesse?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский