![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Здравствуйте !
Допустим, мы пытаемся работать примерно так: var hDevice: THandle; OverLapCallBack: LPOVERLAPPED_COMPLETION_ROUTINE; //////////// BindIoCompletionCallback(hDevice, OverLapCallBack, 0); //////////// Теперь нам надо остановить работу. Например, так: CloseHandle(hDevice); Мечта: дождаться события "последнего вызова" OverLapCallBack. И, дождавшись, выполнить действия, несовместимые с вызовом OverLapCallBack. Как это можно реализовать ? Счетчик запросов\ответов... - откуда нам взять уверенность, что при любом варианте завершения вызовов колбэка их значения будут совпадать. Передать с Overlapped флаг завершения... - дело может и не дойти до вызова колбэка с этим флагом. Анализ ошибки в OverLapCallBack... - работа может завершиться и без ошибок или какая-нибудь из них(ошибок) приведет к остановке без вызова колбэка. Какие еще есть способы узнать о "последнем вызове" (Что-нибудь типа проверки внутри колбэка очереди запросов) ? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Что такое hDevice? как его получаешь? попдробнее плиз...
А почему бы им и не совпадать? (пример?) короче опиши поподробней как ты видишь последовательность хода событий. Помоему счетчик запросов - нормальный выход -------------------- Обижено школьников: 8 |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Я тестирую на Pipe'ах, примерно так: Берем колбэк такого вида: procedure Overlapped_CallBack_(cbError: DWord; BytesTransf: DWord; pOverLap: POVERLAPPED); stdcall; var Transf: DWord; begin with PPOOLOVERLAPPED(pOverLap)^ do begin if cbError = ERROR_SUCCESS then case SelfID of - MAXINT.. -1: PostThreadMessage(ThreadID, NP_WM_SEND,.... 0: PostThreadMessage(ThreadID, NP_WM_CONNECT,.... 1..MAXINT: PostThreadMessage(ThreadID, NP_WM_RECEIVE,.... end else PostThreadMessage(ThreadID, NP_WM_ERROR,.... inc(FRealize); end; end; Одновременно сервер и клиент начинают посылать друг другу по ~400 пакетов (чтобы подольше работали). В "главной командной" with aMsg do try case message of NP_WM_RECEIVE: with TServerChannel(lParam) do begin if not ReadPipe(BytesRead) then Disconnect; if FRealize = 100 then Close_Handle(FhPipe); <---- при получении сообщения о сотом вызове колбэка, тупо закрываем Pipe'овый Handle Как результат получаем следующее (последние сообщения от колбэка из лога): (последние две цифры - кол-во запросов = кол-во ответов) 05:08:20.921 = 264 = TServerChannel = _OnSend = 199 = 103 05:08:20.933 = 264 = TServerChannel = _OnReceive = 199 = 104 На двух последних вызовах колбэка (он сумел добраться до 104-ого вызова) запросов мы успели сделать - 199, а ответов, только 104 Т.е. нам удалось смоделировать ситуацию завершения работы с разным кол-ом запросов\ответов P.S. Счетчик учитывает запросы\ответы только сервера. |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 21 Всего: 32 |
Извиняюсь за возможную дезинформацию...
Что-то мне не удается повторить, то о чем я говорила. Видимо, остановка произошла не из-за закрытия хэндла, а по какой-то другой причине |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |