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

Вниз

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

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

Наверх




Память: 0.45 MB
Время: 0.061 c
1-1160308687
brother
2006-10-08 15:58
2006.11.19
Старт сервиса сразу


15-1162285919
Crazybeaver
2006-10-31 12:11
2006.11.19
Альтернатива FrontPage


15-1162216707
race1
2006-10-30 16:58
2006.11.19
Без дорог


1-1159168787
fynjy1984
2006-09-25 11:19
2006.11.19
WebBrowser и картинки


2-1162462884
Kosh
2006-11-02 13:21
2006.11.19
мышь





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