Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.13;
Скачать: CL | DM;

Вниз

ReadFileEx - место "повторного вызова".   Найти похожие ветки 

 
Riply ©   (2007-04-25 12:01) [0]

Здравствуйте !
Допустим, у нас есть нить - читатель. Висит и ждет, когда кто-нибудь что-нибудь напишет.
Получив послание, читает его и начинает ждать следующее (вызывает ReadFileEx).
Вызывать ReadFileEx можно в нашей нити (по событию WAIT_IO_COMPLETION):
procedure Overlap_CallBack(cbError: DWord; BytesTransf: DWord; pOverLap: POVERLAPPED); stdcall;
begin
// Читаем, что-то делаем
end;
// В нити-читателе
case MsgWaitForMultipleObjectsEx(1, hStopEvent, TimeOut, QS_POSTMESSAGE, MWMO_ALERTABLE) of
WAIT_IO_COMPLETION: ReadFileEx(hPipe, pData, cbData, @OverLapRead, @Overlapped_CallBack);
else //.....
end;

А можно вызывать ReadFileEx и в CallBack процедуре (получится что-то типа рекурсии):
procedure Overlap_CallBack(cbError: DWord; BytesTransf: DWord; pOverLap: POVERLAPPED); stdcall;
begin
// Читаем, что-то делаем
if cbError = ERROR_SUCCESS then
 with PMyOverlap(pOverLap.hEvent) do
  ReadFileEx(hPipe, pData, cbData, pOverLap, @Overlapped_CallBack);
// Если что-то не так, то посылаем сообщение в нить - читатель
end;
// А в нити-читателе один раз вызвали ReadFileEx и забыли про него (пока он не сообщит об ошибке).
Своими делами занимаемся :)
case MsgWaitForMultipleObjectsEx(1, hStopEvent, TimeOut, QS_POSTMESSAGE, MWMO_ALERTABLE) of
WAIT_OBJECT_0: .....
WAIT_OBJECT_0 + 1: ...
else //.....
end;

Какой из этих вариантов лучше использовать (конечно, если второй, вообще, имеет право на существование)
и в чем их отличие (кроме, по кол-ва событий WAIT_IO_COMPLETION) ?


 
Сергей М. ©   (2007-04-25 12:10) [1]

И тот и другой вариант корректен и имеет право на жизнь.
Но при прочих равных условиях я предпочел бы 2-й.


 
Riply ©   (2007-04-25 12:35) [2]

>[1] Сергей М. ©   (25.04.07 12:10)
>И тот и другой вариант корректен и имеет право на жизнь.
>Но при прочих равных условиях я предпочел бы 2-й.
Спасибо. Тогда продвинемся чуть дальше:
Можно ли твой ответ распространить и на создани нитей-читателей при помощи BindIoCompletionCallback ?
(со своим сообщение вместо WAIT_IO_COMPLETION) ?


 
Сергей М. ©   (2007-04-25 13:14) [3]


> Riply ©   (25.04.07 12:35) [2]


Не знаю, врать не буду.

А зачем тебе BindIoCompletionCallback ? Ты все еще ту прежнюю идею мусолишь ?)


 
Riply ©   (2007-04-25 13:24) [4]

> [3] Сергей М. ©   (25.04.07 13:14)
>А зачем тебе BindIoCompletionCallback ? Ты все еще ту прежнюю идею мусолишь ?)
Сравниваю то и то. У каждого способа есть свои достоинства и свои недостатки.
Так что еще чуть-чуть "помусолю", с твоего разрешения :)
P.S. А за что ты так невзлюбил пулы ? :)


 
Сергей М. ©   (2007-04-25 13:35) [5]


> еще чуть-чуть "помусолю", с твоего разрешения


Ладно уж, так уж и быть - мусоль себе на здоровье)... Мне ж не жалко)


> за что ты так невзлюбил пулы ?


В смысле, thread pools ? А причем здесь они ?

Если мне не изменяет память, ты вроде бы как раз стремилась обойтись одним транспортным тредом на все пайпы. А когда речь идет о тред-пуле, подразумевается пул тредов, обрабатывающих данные, а не доставляющих (т.е. транспортных) эти данные для обработки.

?


 
Riply ©   (2007-04-25 14:11) [6]

> [5] Сергей М. ©   (25.04.07 13:35)
Значит я еще не научилась ясно излагать свои мысли.
В будущем, когда мой пайповый сервер подрастет и перестанет совершать ошибки :),
я планирую сделать его сервисом. И, соответственно, вижу его таким:
Есть главная нить (с маленьким "временем отклика").
Она отвечает только за обработку команд и запросов
от сервис-менеджера и "глобально" управляет пайповым сервером(пайповыми нитями),
который(которые), в свою очередь занимаются только обслуживанием клиентов.
Ну и, конечно, не хочется заставлять многоуважаемых клиентов простаивать в очереди :)


 
Сергей М. ©   (2007-04-25 14:43) [7]


> Riply ©   (25.04.07 14:11) [6]


> планирую сделать его сервисом


С т.з. концепции и логики организации сервера (пайп или не пайп - не суть как важно) совершенно безразлично, где он будет "жить" - то ли в сервисе, то ли в GUI, то ли в консоли. Так что для полной ясности этот момент можно и вовсе не упоминать. Никогда не поздно перенести свою готовую "отточенную" логику из GUI (или консоли) в сервис или наоборот.


> главная нить отвечает только за обработку команд и запросов
> от сервис-менеджера и "глобально" управляет пайповым сервером(пайповыми нитями),
> который(которые), в свою очередь занимаются только обслуживанием клиентов.


Тогда есть полное основание назвать эту нить транспорно-диспетчерской.

За малое время отклика можно не волноваться, если траспортные ф-ции, исполняемые этой нитью, реализованы с использованием overlapped-операций ввода/вывода или механизма колбэков, т.е. в твоем случае те самые Read/WriteEx-вызовы.

Узким местом остается создание/уничтожение нитей, собственно обрабатывающих кл.запросы, которые каналам ввода-выпода принимает/передает транспортно-диспетчерская нить. Один из путей преодоления этой проблемы как раз и ведет к организации пула таких нитей. Задача пула - при фиксированном (в некоем "необходимо-достаточном" пределе) числе "дежурных" нитей организовать в их контекстах максимально быструю параллельную обработку потока запросов от различных клиентов с формированием потока результатов обработки этих запросов.


 
Riply ©   (2007-04-25 15:39) [8]

> [7] Сергей М. ©   (25.04.07 14:43)
Спасибо.
С самым главным - общей структурой и терминологией, разобрались.
Осталось дело за малым - реализацией :)


 
Сергей М. ©   (2007-04-25 15:44) [9]


> Riply ©   (25.04.07 15:39) [8]


Дерзай !

Барышня ты, как минимум, "при голове")..
Сие признаю и сие весьма приятно, тэкскэть, "на фоне")


 
Riply ©   (2007-04-25 15:50) [10]

> [9] Сергей М. ©   (25.04.07 15:44)
:)
Ох и слаба же я на комплименты :)


 
Сергей М. ©   (2007-04-25 15:52) [11]


> Riply ©   (25.04.07 15:50) [10]


Ой не загордись только !)
Оно уж точно во вред будет)


 
Германн ©   (2007-04-25 16:50) [12]


> Ой не загордись только !)

Интересно какой тогда ник будет :)



Страницы: 1 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.114 c
2-1177339902
Саня Сафронов
2007-04-23 18:51
2007.05.13
Помогите, пожалуйста, составить прогу!


2-1177317931
evgenij_
2007-04-23 12:45
2007.05.13
Запустить Access Report из Delphi


2-1177508495
Key999
2007-04-25 17:41
2007.05.13
Как вывести время техпроцесса в чч:мм:сс, если оно превышает 24 ч


2-1177488098
Riply
2007-04-25 12:01
2007.05.13
ReadFileEx - место "повторного вызова".


2-1177260570
Exile
2007-04-22 20:49
2007.05.13
Help с WinAPI