Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1176274427
ocean
2007-04-11 10:53
2007.05.13
Действительно, куда там Донцовой


2-1177098573
lubopitniy
2007-04-20 23:49
2007.05.13
поиск в строке


2-1177495186
cvg
2007-04-25 13:59
2007.05.13
эстетичное обращение к последнему элементу массива


11-1159283659
Моторокер
2006-09-26 19:14
2007.05.13
Int2Str vs. IntToStr


3-1171954380
D@Nger
2007-02-20 09:53
2007.05.13
Pdoxusrs.net и как с ним работать





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