powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод асинхронного вызова в синхронный
12 сообщений из 12, страница 1 из 1
Перевод асинхронного вызова в синхронный
    #39654771
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Необходимо выполнить метод одного объекта и дождаться его завершения. А это можно узнать только через событие.
Код "ожидания" должен одинаково хорошо работать как в главном, так и в любом другом потоке приложения.

Какие еще варианты предложите? Всё в одном потоке: и объект FCalculator, и вызывающий его TMyTask

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
type
   TMyTask = class
   private
      FCalculator     : TCalculator;
      FCalculatedFlag : boolean;
      
      procedure OnCalculated(Sender: TObject);      
      ...
   end;
   
   
//------------------------------------------------------------------------------
constructor TMyTask.Create();
begin
   FCalculatedFlag := false;
   
   FCalculator := TCalculator.Create();
   FCalculator.OnCalculated := OnCalculated;   
end;
//------------------------------------------------------------------------------
procedure MyProcessMessages();
var
   lpMsg    : TMsg;
begin
   while PeekMessage(lpMsg,0,0,0,PM_REMOVE) do
   begin
      TranslateMessage(lpMsg);
      DispatchMessage(lpMsg);
   end;
end;
//------------------------------------------------------------------------------
procedure TMyTask.Execute();
begin
   FCalculatedFlag := false;
   
   FCalculator.Calculate();
   
   while not FCalculatedFlag do
   begin
      sleep(10);
      MyProcessMessages();
   end;   
   
   //...
end;
//------------------------------------------------------------------------------
procedure TMyTask.OnCalculated(Sender: TObject);
begin
   ...
   FCalculatedFlag := true;
end;
      
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39654775
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
Код: pascal
1.
2.
3.
4.
5.
   while not FCalculatedFlag do
   begin
      sleep(10);
      MyProcessMessages();
   end;   


Это зачем?

Я-бы создал объект, который создает себе окно для ловли сообщения от самого себя и в нем-бы вызывал OnCalculated. Всё.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39654778
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

не, ну с окном это слишком, плюс без того же цикла ожидания с ProcessMessages тоже будет не обойтись
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39654781
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнКакие еще варианты предложите?

1) Пересмотреть задачу чтобы избавиться от условия "в любом потоке".
2) Проанализировать исходники TCalculator, поскольку асинхронные методы нынче
подразумевают создание потока и тут надо очень тщательно смотреть как вызывается OnCalculated.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39654798
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семёнплюс без того же цикла ожидания с ProcessMessages тоже будет не обойтись
Если это будет в одном потоке, то в этом нет необходимости (читай, бесполезно).
Если в другом, то это еще и вредно. Запустил поток, жди окончания в своем событии.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655161
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нда, я все-таки ожидал, что есть неизвестное мне элегантное решение задачи в её изначальной постановке.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655177
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён,

создаёшь событие (TEvent), устанавливаешь, ждёшь сброса. сброс делаешь в событии?
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655190
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик СемёнНда, я все-таки ожидал, что есть неизвестное мне элегантное решение задачи в её изначальной постановке.
чёт я сегодня добрый

посмотри реализацию обхода блокировки в TThread.WaitFor
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655205
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсоздаёшь событие (TEvent), устанавливаешь, ждёшь сброса. сброс делаешь в событии?

Я не проверял (хотя это была самая первая мысль), но по идеи, раз поток будет остановлен на точке Event.WaitFor, то я думал до события никогда и не дойдет. Я о случае с бесконечным ожиданием.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655212
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён...раз поток будет остановлен на точке Event.WaitFor, то я думал до события никогда и не дойдет...
Да.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655276
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён,

если есть возможность поток просто подождать, то WaitFor вполне достаточно.
...
Рейтинг: 0 / 0
Перевод асинхронного вызова в синхронный
    #39655287
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем ответившим,
тему пока не закрываю, буду следить за постами.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод асинхронного вызова в синхронный
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]