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

Некорректно отрабатывает поток в Андройде


sasha

Вопрос

Приветствую!

Некорректно отрабатывает поток в Андройде, а именно мерцания экрана

procedure Tspotok.Add;
begin
   Form1.foot.Add(Form1.ListBox1);
end;

procedure Tspotok.Add2;
begin
Form1.st.Add(Form1.ListBox1);
end;

procedure Tspotok.Add3;
begin
 Form1.st.ListImage.Items[Form1.st.ListvName.Count-1].Bitmap.LoadFromStream(BlobStream);
end;

procedure Tspotok.Execute;
var FDConnection1: TFDConnection;
          FDQuery1: TFDQuery;
          FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
          FDGUIxWaitCursor1: TFDGUIxWaitCursor;
          j,i:integer;
begin
  FDConnection1:=TFDConnection.Create(nil);
  FDConnection1.DriverName:='SQLite';
  FDPhysSQLiteDriverLink1:=TFDPhysSQLiteDriverLink.Create(nil);
  FDGUIxWaitCursor1:=TFDGUIxWaitCursor.Create(nil);
  FDQuery1:=TFDQuery.Create(nil);
  {$IFDEF ANDROID}
  FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'base.db');
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  FDConnection1.Params.Values['Database'] :='E:\Embarcadero\Studio\Projects\NANDBOOK_TWO\base.db';
  {$ENDIF}
  FDConnection1.Connected:=TRUE;
  for I := 0 to 16 do
  begin
  FDQuery1.SQL.Text:='SELECT * FROM  '+Form1.NameBaseconst+' WHERE name LIKE "'+Form1.v+'%"';
  FDQuery1.Connection:=FDConnection1;
  FDQuery1.Active := True;
  FDQuery1.Open;
  Synchronize(Add);

   Form1.foot.ListvName.Items[Form1.foot.List.Count-1].Text:=Form1.NameB;
  if FDQuery1.RecordCount=0 then
    begin
      Form1.foot.List.Items[Form1.foot.List.Count-1].Visible:=false;
    end;
  if not FDQuery1.IsEmpty then
    begin
    //Log.d('LOG-FDQuery1.RecordCount='+FDQuery1.RecordCount.ToString());
    for j := 0 to FDQuery1.RecordCount-1 do
      begin
          Synchronize(Add2);
           Form1.st.List.Items[Form1.st.ListvName.Count-1].Parent:= Form1.ListBox1;
           Form1.st.ListTag.Items[Form1.st.ListvName.Count-1].Text:=IntToStr(Form1.ListBox1.Count-1);
           Form1.st.ListvName.Items[Form1.st.ListvName.Count-1].Text :=FDQuery1.FieldByName('name').AsString;
           Form1.st.ListBase.Items[Form1.st.ListvName.Count-1].Text :=Form1.NameBaseconst;
           Form1.st.ListID.Items[Form1.st.ListvName.Count-1].Text :=FDQuery1.FieldByName('id').AsString;
           BlobStream:=TStream.Create;
           BlobStream := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('image'),TBlobStreamMode.bmRead);
           Synchronize(Add3);
           FDQuery1.Next;
      end;
    end;

   FDQuery1.Close;
    FDQuery1.Active := false;
  end;
    FDConnection1.Connected:=false;
  end;
end.

 

А в осном unite

var
  QW:Tspotok;
..
            QW:=Tspotok.Create(true);
            QW.FreeOnTerminate:=true;
            QW.Resume;

 

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

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

  • 0

Зачем это все в потоке? FireDac компоненты могут работать в асинхронном режиме, не нужно их в поток засовывать. 

Вроде обсуждали что FireDac не работает на андроид... Этот код рабочий? т.е. Вы работали с устройства с базой данных?

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
22 часа назад, Mazzay сказал:

У меня прекрасно работает. Что я делаю не так?

Некорректно выразился, на андроид не работает связка FireDac + MySQL, т.к. используется libmysql.dll, с sqLite все вроде ок.

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0

1.Запомните одну простую вещь : Метод Synchronize   - это ни что иное  как "остановить текущий поток и выполнить кусок действий   из указанной процедуры в главном потоке"

2. С визуальными компонентами формы напрямую из потока работать нельзя!

Теперь понятно почему мерцает ?  :)


У автора  сам алгоритм несколько коряв - поток постоянно тормозится и передает управление главному , потом  назад опять обработка . опять тормоз  и т.д. все это в цикле.
+  если я не ошибаюсь, к тому же идет обращения к  визуальным компонентам главной формы, что  без синхронизации  делать нельзя.
Т.е. как таковой смысл в этом потоке отсутствует :)
 Создайте временное хранилище, в который пихнете выборку из базы .  И по окончании обработк-выборки  всех данных, через synchronize  уже вышвырните на Form1 со всеми вашими модификациями в одной единственной процедуре. .

 


 

Изменено пользователем Ghk
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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