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

TThread.ForceQueue не работает в Android


Евгений Корепов

Вопрос

TThread.ForceQueue не работает в Android. Но можно утешить себя тем, что отлично работает в Windows ;-)

Код следующий:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo,
  FMX.Controls.Presentation, FMX.ScrollBox;

type
  TForm1 = class(TForm)
    Memo: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyLog(AMessage : String);
    procedure TestForceQueue;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.TestForceQueue;
begin
  MyLog('In main thread start');
  TThread.ForceQueue(Nil,
    procedure
    begin
      MyLog('In ForceQueue start');
      TThread.Sleep(2000);
      MyLog('In ForceQueue stop');
    end);
  MyLog('In main thread stop');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  TestForceQueue;
end;

procedure TForm1.MyLog(AMessage : String);
Var ATime : String;
    LMessage : String;
begin
  DateTimeToString(ATime, 'dd.mm.yyyy hh.nn.ss.zzz', Now);
  LMessage:=ATime + ' ' + AMessage;
  TThread.Synchronize(Nil,
    procedure
    begin
      Memo.Lines.Add(LMessage);
    end);
end;

end.

В Windows все работает как ожидается:

Цитата

13.04.2017 16.08.17.028 In main thread start
13.04.2017 16.08.17.028 In main thread stop
13.04.2017 16.08.17.028 In ForceQueue start
13.04.2017 16.08.19.029 In ForceQueue stop

В андроиде ситуация следующая:

Цитата

13.04.2017 16.06.58.554 In main thread start
13.04.2017 16.06.58.580 In ForceQueue start
13.04.2017 16.07.00.586 In ForceQueue stop
13.04.2017 16.07.00.770 In main thread stop

Т.е. нифига не работает.

Тестовый проект прилагаю.

test094 ForceQueue test.7z

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

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

  • 0
2 часа назад, Евгений Корепов сказал:

Т.е. нифига не работает.

А может не работает потому что неправильно написано? На мой взгляд MyLog не потокобезопасная процедура, а вы к ней обращаетесь из разных потоков. Из своего опыта я бы даже для Windows так делать не стал бы, один раз прокатит другой нет.

Ссылка на комментарий
  • 0
1 минуту назад, GASCHE сказал:

А может не работает потому что неправильно написано? На мой взгляд MyLog не потокобезопасная процедура, а вы к ней обращаетесь из разных потоков. Из своего опыта я бы даже для Windows так делать не стал бы, один раз прокатит другой нет.

Все с ней хорошо, ведь там есть

TThread.Synchronize(Nil,
    procedure
    begin
      Memo.Lines.Add(LMessage);
    end);

К тому же это упрощенный вариант, в рабочем вместо Memo использовалась отсылка данных на сервер логов. Результат тот же.

Ссылка на комментарий
  • 0
6 минут назад, Евгений Корепов сказал:

Все с ней хорошо

Думаю нет, вы не знаете какой поток к ней обратиться в тот или иной момент времени. В Windows у вас отрабатывает сначала основной поток потом ForceQueue в андроид ForceQueue вклинивается в основной поток.

Ссылка на комментарий
  • 0
В 13.04.2017 в 19:06, GASCHE сказал:

Думаю нет, вы не знаете какой поток к ней обратиться в тот или иной момент времени. В Windows у вас отрабатывает сначала основной поток потом ForceQueue в андроид ForceQueue вклинивается в основной поток.

Напишите свой, "правильный" код если хотите доказать что TThread.ForceQueue работает в андроиде и я ошибаюсь. К чему этот бесполезный флуд?

Ссылка на комментарий
  • 0
  • Модераторы
11 минуту назад, Maximus сказал:

А что это вообще за метод TThread.ForceQueue? Где вы его взяли, его же нет в TThread.

В токио

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

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

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

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

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

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

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

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

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

×
×
  • Создать...