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

Вниз

"Блокирующие" вызовы функций.   Найти похожие ветки 

 
l|l|l|l|   (2006-11-04 14:06) [0]

Есть мой класс который образовывает систему обмена данными между клиентом и сервером по собственному протоколу. И для наглядности приведу пример использования, который сейчас у меня актуален. (все имена функций, переменных и данных вымышлены)

var
 TempProtocol: TProtocol;

procedure TForm1._OnGetTomorrowWeather(Sender: TObject; Struct: TStruct);
begin
 ShowMessageFmt("Your city: %s, your time: %s", [Struct.City, Struct.Time]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TempProtocol := TProtocol.Create;
 TempProtocol.OnGetTomorrowWeather := _OnGetTomorrowWeather;
 TempProtocol.GetTomorrowWeather;
 ...
end;


 
Как вы видите, создаю класс, и делаю запрос с сервера данных — GetTomorrowWeather, когда он приходит и TProtocol парсит ответ сервера, случается — OnGetTomorrowWeather.
Сейчас необходимо создать ещё один вариант процедуры GetTomorrowWeather (создать надо функцию), который бы не просто передавал данные на сервер, а и ждал их прихода, т.е. сама новая функция должна возвращать то, что сейчас возвращает OnGetTomorrowWeather — TStruct. При этом функционал прошлого варианта с event"ом OnGetTomorrowWeather должен сохраняться.
Выгладеть это должно примерно так:

procedure TForm1.Button1Click(Sender: TObject);
var
 Struct: TStruct
begin
 TempProtocol := TProtocol.Create;
 Struct := TempProtocol.GetTomorrowWeather2;
 ...
end;


Соответственно GetTomorrowWeather, отвечает за способ с отдельной нотификацией, а GetTomorrowWeather2 за возвращение результата в функции.
Как такое осуществить?


 
guav ©   (2006-11-04 15:29) [1]

> [0] l|l|l|l|   (04.11.06 14:06)
> Как вы видите, создаю класс, и делаю запрос с сервера данных
> — GetTomorrowWeather, когда он приходит и TProtocol парсит
> ответ сервера, случается — OnGetTomorrowWeather.

Т.е. метод GetTomorrowWeather возвращает сразу ?
Тогда вопрос, как, а главное откуда, реализован вызов OnGetTomorrowWeather:
* вызывается ли он из отдельного потока,
* вызывается ли он из цикла обработки сообщений (например, неблокирующие сокеты с WSAAsyncSelect),
* или для запуска обмена по протоколу существует одельный метод, из которого OnGetTomorrowWeather вызывается синхронно ?

От ответа на этот вопрос зависит ответ на вопрос о том как иммитировать синхронный вызов.


 
l|l|l|l|   (2006-11-04 16:32) [2]

Внутри TProtocol, для работы с сетевой фукцией используется другой класс (Назовем его TOurWSocket), который отвечает за контроль целостности пакета, в итоге после него гарантированный цельный пакет от сервера.
Сам TOurWSocket базируется на стороннем классе ICS TWSocket: у которого все просто, соединяемся, при наличии полученных данных в буфере возбуждается OnDataAvailable, и мы контролируем по заголовку пакета целостность его.
В самом TOurWSocket при наличии корректного пакета возбуждается OnPacketAvailable, который в TProtocol уже и обрабатываем примерно так:

procedure TProtocol._OnPacketAvailable(Packet: TPacket);
var
 WeatherStruct: TStruct;
begin
 ....
 case GetPktCommand(@Packet) of
   $0a: ....
   $0d: ....
   $0e:
   begin
     GetPacketWeatherStruct(@Packet, WeatherStruct);
       if Assigned(OnGetTomorrowWeather) then
         OnGetTomorrowWeather(WeatherStruct);
   end;
 end;
 ....  
end;


 
guav ©   (2006-11-04 19:07) [3]

ICS работают через асинхронные сокеты, поэтому требуется цикл обработки сообщения для события.
Вызов Application.Processmessages в цикле должен привести к обработке события при его наступлении (если сокет работает в GUI потоке). после получения события можно выйти из того цикла и вернуть результат. При этом обработчики сообщений контролов будут вызываться, так что потребуется предупредить повторной вхождение в обработчик при необходимости. Можно организовать ожидание только сообщения сокета и только окна сокета - GetMessage с параметрами и DispatchMessage, тогда приложение дейсвительно будет "зависать", как при синхронном вызове.
Более конкретно ничего предложить не могу, c ICS не работал.



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

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

Наверх




Память: 0.48 MB
Время: 0.05 c
4-1152189062
Серге И
2006-07-06 16:31
2006.11.19
Определение температуры на материнской плате с двумя процессорами


15-1162213360
Synset
2006-10-30 16:02
2006.11.19
CVS


8-1144670277
Acidlex
2006-04-10 15:57
2006.11.19
Измерение уровня сигнала с микрофона и линейного входа


2-1162226455
Golik
2006-10-30 19:40
2006.11.19
где ошибка ?


4-1152095200
Daber
2006-07-05 14:26
2006.11.19
Как определить существование Мыши в WinXP?