Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод асинхронного вызова в синхронный / 12 сообщений из 12, страница 1 из 1
04.06.2018, 11:52
    #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
04.06.2018, 11:57
    #39654775
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевод асинхронного вызова в синхронный
Кроик Семён
Код: pascal
1.
2.
3.
4.
5.
   while not FCalculatedFlag do
   begin
      sleep(10);
      MyProcessMessages();
   end;   


Это зачем?

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

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

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

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

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

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

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


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