Форум: "Начинающим";
Текущий архив: 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.045 c