Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BindIoCompletionCallback, Определение последнего вызова "колбэка" 
:(
    Опции темы
Riply
Дата 4.4.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Здравствуйте !
Допустим, мы пытаемся работать примерно так:
var
 hDevice: THandle;
 OverLapCallBack: LPOVERLAPPED_COMPLETION_ROUTINE;
////////////
BindIoCompletionCallback(hDevice, OverLapCallBack, 0);
////////////
Теперь нам надо остановить работу. 
Например, так: CloseHandle(hDevice);
Мечта: дождаться события "последнего вызова" OverLapCallBack.
И, дождавшись, выполнить действия, несовместимые с вызовом OverLapCallBack.  smile 

Как это можно реализовать ?
Счетчик запросов\ответов... - откуда нам взять уверенность, 
что при любом варианте завершения вызовов колбэка их значения будут совпадать.
Передать с Overlapped флаг завершения... - дело может и не дойти до
вызова колбэка с этим флагом.
Анализ ошибки в OverLapCallBack... - работа может завершиться и без ошибок
или какая-нибудь из них(ошибок) приведет к остановке без вызова колбэка.
Какие еще есть способы узнать о "последнем вызове" 
(Что-нибудь типа проверки внутри колбэка очереди запросов) ?

PM MAIL   Вверх
bems
Дата 5.4.2007, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Что такое hDevice? как его получаешь? попдробнее плиз...


Цитата(Riply @  4.4.2007,  22:51 Найти цитируемый пост)
Счетчик запросов\ответов... - откуда нам взять уверенность, 
что при любом варианте завершения вызовов колбэка их значения будут совпадать.

А почему бы им и не совпадать? (пример?)

короче опиши поподробней как ты видишь последовательность хода событий. Помоему счетчик запросов - нормальный выход



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Riply
Дата 5.4.2007, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(bems @  5.4.2007,  03:02 Найти цитируемый пост)
Что такое hDevice? как его получаешь? попдробнее плиз...


Цитата(bems @  5.4.2007,  03:02 Найти цитируемый пост)
А почему бы им и не совпадать? (пример?)
короче опиши поподробней как ты видишь последовательность хода событий. Помоему счетчик запросов - нормальный выход

Я тестирую на 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 пакетов (чтобы подольше работали).
В "главной командной"  smile  нити сервера:
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
Т.е. нам удалось смоделировать ситуацию завершения работы с разным кол-ом запросов\ответов  smile  
P.S. Счетчик учитывает запросы\ответы только сервера.   



PM MAIL   Вверх
Riply
Дата 5.4.2007, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Извиняюсь за возможную дезинформацию...
Что-то мне не удается повторить, то о чем я говорила.
Видимо, остановка произошла не из-за закрытия хэндла,
а по какой-то другой причине  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.