Главная страница
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.04 c
2-1162358463
apic
2006-11-01 08:21
2006.11.19
EXE в БД


6-1151469279
grab3
2006-06-28 08:34
2006.11.19
VPN/DIALUP соединения


15-1162468189
Карелин Артем
2006-11-02 14:49
2006.11.19
Тайный смысл фразы "How are you"...


15-1162137406
Reaktor
2006-10-29 18:56
2006.11.19
VB в excel


3-1158571807
NotGooDP
2006-09-18 13:30
2006.11.19
Программное добавление Usera MsSql