Перейти к содержанию
Fire Monkey от А до Я
  • 0

TMessageManager.DefaultManager.SendMessage асинхронно


Vitaly X

Вопрос

Здравствуйте

Никак не могу понять, как сделать корректно...

Ситуация - подписан на intent со сканера и когда получаю код, то шлю в главную форму через TMessageManager.DefaultManager.SendMessage. НО, до отсылки шлю обратно в другой intent.

Проблема в том, что если в коде есть Sleep(10000), то посылка отправится, когда отработает то, что послал через TMessageManager.DefaultManager.SendMessage.

 

Есть какойто вариант сделать так как я хочу?

 

 

 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

отправляю посылку так  

procedure a;

begin

   sendIntent(StringToJString(ACTION), StringToJString(PLUGIN), StringToJString(EXTRA_KEY));   <----- почему это выполняется после Sleep(10000) ?
      ...........................................
   TMessageManager.DefaultManager.SendMessage(Self, TStatusMessage.Create(status));

end;

 

 

принимаю так

procedure b;

begin

Sleep(10000);

end;

Ссылка на комментарий
  • 0

Проблема заключается в том, что вызов функции Sleep блокирует главный поток приложения, что приводит к остановке обработки сообщений в очереди сообщений Windows. В результате функция SendMessage не сможет отправить сообщение до тех пор, пока главный поток не будет освобожден и сможет продолжить обработку очереди сообщений.

Для решения этой проблемы необходимо использовать асинхронный подход и выполнять задержку в отдельном потоке, чтобы не блокировать главный поток приложения. Например, можно использовать класс TTask из библиотеки Delphi для выполнения задержки в отдельном потоке.

Пример использования TTask для выполнения задержки в отдельном потоке:

uses
  System.Threading;

procedure SendResult(ResultCode: Integer);
var
  Message: TMessage<Integer>;
begin
  // отправляем результат в другой intent
  // ...
  
  // отправляем результат в главную форму
  Message := TMessage<Integer>.Create(ResultCode);
  TMessageManager.DefaultManager.SendMessage(nil, Message);
end;

procedure ScanResultHandler(const AData: TArray<TScanResult>);
var
  ResultCode: Integer;
begin
  // обработка сканера
  // ...
  
  // задержка в отдельном потоке
  TTask.Run(
    procedure
    begin
      Sleep(10000);
      SendResult(ResultCode);
    end);
end;

В этом примере мы использовали анонимную процедуру, чтобы выполнить задержку в отдельном потоке. Задержка выполняется с помощью функции Sleep, а затем мы вызываем функцию SendResult, чтобы отправить результат в другой intent и в главную форму через TMessageManager.DefaultManager.SendMessage. Поскольку задержка выполняется в отдельном потоке, главный поток приложения не блокируется, и сообщения в очереди обрабатываются нормально.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...