• 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
11 минуту назад, Maximus сказал:

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

В токио

Евгений Корепов и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Алмаз Амангельды
      Multi device application 
      Работаю  с WebBrowser и появляется такая проблема что компонент дублируется появляется тоненькая полоска (пикселей 10 или 5 ) которая работает отдельно (т.е можно скролить страницу в разные направления ,  поэтому складывается впечатление что данный компонент Дублируется )
      Вверху tabcontrol к нему добавлен Эффект shadow внизу
      twebBrowser  Align =Client 
      И все эти компоненты лежат на panel 
      Align =client 
       
      Тестирую на экране 5.5
      Естественно вопрос что произошло и как это исправить 
    • Автор: ENRGY
      Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.
      А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?
      POST запрос? Кто нибудь делал такое уже?
      Спасибо 
       
      P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 
    • Автор: Макс Войтенко
      я знаю что можно добавить внешний файл в программу по пути (assets\internal)(скриншот) (раньше получали к нему доступ через)
      loadfromfille(GetDocumentsPath()+"test.txt")
      Сейчас GetDocumentsPath убрали из RadStudio и походу заменили чем то.
      я использовал в свой программе директорию 
      loadfromfille(GetHomePath()+"test.txt"), но я не знаю куда мне добавить программу через deploymant (скриншот)
      Тоесть
      1)GetDocumentsPath = (assets\internal) 
      2)GetHomePath= ??????
      3)GetDocumentsPath убрали из radstudio.
      Какую мне прописать директорию чтоб я имел к ней доступ через GetHomePath()??

    • Автор: Алмаз Амангельды
      Привет всем! 
      Кодить начал на андроид совсем недавно возникают некие проблемы и спорные вопросы, и перейду сразу к вопросу как пользоваться BoringSSL под Андроид 6 и ниже, возможно ли использовать BoringSSL  на андроидах ниже 6, и как реализовать сие чудо!
      З.Ы если есть возможность опишите по подробнее...
      (дело в том что я хочу спрарсить парочку постов с паблика VK)
       
    • Автор: msp888
      Если Wi-Fi на телефоне работает в режиме клиента (подключается к внешней точке доступа), то как с ним работать понятно.
      Если же Wi-Fi на телефоне (ОС Android) работает в режиме персональной точки доступа, то как из программы получить свой ip-адрес и другие параметры сети.
      Кто знает, помогите, желательно исходный код на Delphi.
    • Автор: msp888
      Если Wi-Fi на телефоне работает в режиме клиента (подключается к внешней точке доступа), то как с ним работать понятно.
      Если же Wi-Fi на телефоне (ОС Android) работает в режиме персональной точки доступа, то как из программы получить свой ip-адрес и другие параметры сети.
      Кто знает, помогите, желательно исходный код на Delphi.
       
    • Автор: Rusland
      Delphi Tokyo
      ListView->ItemAppearance->ItemAppearance=DynamicAppearance
      Есть ImageList c 3 картинками.
      Добавляю item-ы в ListView:
      procedure TForm1.Button1Click(Sender: TObject); var i:integer; Lvi: TListViewItem; begin LsvObjects.BeginUpdate; LsvObjects.Items.Clear; try for i:=0 to 100 do begin Lvi := LsvObjects.Items.Add; Lvi.Tag := i; Lvi.Data['ObjectText'] := 'ObjectText '+i.ToString; Lvi.Data['StateText'] := 'StateText '+i.ToString; Lvi.Data['ConnectText'] := 'ConnectText '+i.ToString; end; finally LsvObjects.EndUpdate; end; end; в UpdateObjects рандомно выбираю картинку:
      procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var ... oConnectImage: TListItemImage; r: integer; begin r:=Random(ImageList1.Count); oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage; if (oConnectImage<>nil) then oConnectImage.ImageIndex:=r; ... end; В Windows все нормально. А вот что я вижу на планшетах:
      На Dexp:   
      На Lenovo:
       
      Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.
      Про Berlin добавлю вопрос позже.
    • Автор: Евгений Корепов
      Обнаружил очередной глюк Tokyo - сломали Text в Android. А именно порушили раскраску символов Юникода.
      Воспроизводится просто :
      procedure TFormMain.FormCreate(Sender: TObject); Var Text1: TText; begin Text1:=TText.Create(Self); Text1.Text:='|' + Char($2713) + '|'; Text1.Font.Size:=48; Text1.Color:=TAlphaColorRec.Red; Text1.Align:=TAlignLayout.Client; Text1.TextSettings.HorzAlign:=TTextAlign.Center; Text1.TextSettings.VertAlign:=TTextAlign.Center; FormMain.AddObject(Text1); end; На первом скриншоте этот код выполнен в Berlin, все выглядит как задуманно. На втором скриншоте этот же код в Tokyo.


    • Автор: Alex Bakulin
      MediaPlayer.FileName := System.IOUtils.TPath.GetDocumentsPath + PathDelim + 'zakaz.mp3'; MediaPlayer.Play; Вот такой простой код. При отладке ничего не выдает молча падает. Можно как-то проверить, что файл физически туда деплоится? Нужны ли какие-то дополнительные права приложению?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу