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

Володимир Антонашко

Пользователи
  • Постов

    10
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Володимир Антонашко

  1. Извиняюсь. Действительно все правильно работает. У меня ошибка была в другом месте. Но проблема с памятью осталась. Использование всего трех фотографий по 1мб заняли аж 10мб ОЗУ. Мне нужно найти способ освобождать память после удаление фотографий из  stringgrid.

  2. Я тут подумал.. Что может я выбрал неправильный путь. Может лучше вообще не загружать все через imagelist? Может в drawcolumncell прописать загрузку напрямую из файла. Но тут проблема что интернете нету толком инструкций как пойти напрямую. Может у кого-то завалялся подходящий кусок кода?

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

    В программе я заполняю Tgrid изображениями из Imagelist по имени фото который есть в ячейке . Код :

      if column.index = 8 then    //Загрузка картинок.
        if not value.IsEmpty then
          begin
            column.BeginUpdate;
            i:=StrToInt(maingr.Cells[column.Index,row]);
            imageindex:=main_form.ImageList1.Source.IndexOf(IntToStr(i));
            column.Canvas.Clear(RowColor.Color);
            main_form.ImageList1.draw(column.Canvas,bounds,imageindex,100);
            column.EndUpdate;
          end;

    Если я уберу очистку канвы то изображения накладуються. А так как есть следующий раз при вызове DrawColumnCell изображение остается только в последней записи.

    Но такой код в  процедуре SelectCell нормально отображает изображение. На каждый вызов. Даже если изображение в ячейке нету.

    if acol = 8 then
      begin
              i:=maingr.Cells[Acol,Arow];
              imageindex:=main_form.ImageList1.Source.IndexOf(i);
              imageviewer1.Bitmap.Clear(TAlphaColors.Null);
              imageviewer1.Bitmap:=main_form.ImageList1.Bitmap(size,imageindex);
    	end;

    И по поводу памяти. Как я понял, после того как я присвою изображение ячейке, оно загружается в память. Также когда отображается в ImageViewer.

    Но после удаления строки с изображениям, память остается занята для уже использованных изображений.  То есть при повторном показе память больше не занимается и используется изображение которое было ранее загружено. Думаю это нормальное поведение. Так увеличивается скорость работы программы. Но я собираюсь показывать до 50 фотографий одновременно (средний размер 1мб) из 5-10 тисяч. И мне нужно чтоб после использования изображений память очищалась, иначе программа будет кушать под 10гб оперативной памяти.

  4. Могу добавить что пробовал на windows xp и windows 7. Результат аналогичен. Связка unidac+sqlite в директ режиме. Local.connected точно true. Работа с базой ведеться в основном потоке нормально.

  5. Визуально только опредилить работу могу. Memo не очищаеться. И в tempbase ничего не пишеться.

    procedure localbackup.memcount;
    begin
      count:=main.main_form.sqlmemo.Lines.Count;
    end;
    
    procedure localbackup.updatememo;
    var
    i:integer;
    begin
    setlength(mem,0);
    setlength(mem,main.main_form.sqlmemo.Lines.Count);
    tempbase.SQL.Clear;
    tempbase.SQL.Append('SELECT * FROM queries');
    tempbase.Active:=True;
      for I := 0 to main.main_form.sqlmemo.Lines.Count-1 do
      begin
        tempbase.Insert;
        tempbase.FieldByName('sql_rec').AsString:=main.main_form.sqlmemo.Lines[i];
        tempbase.Post;
        {tempbase.SQL.Append(main.main_form.sqlmemo.Lines[i]);}
      end;
    tempbase.Active:=false;
      main.main_form.sqlmemo.Lines.Clear;
    end;
    
    procedure localbackup.Execute;
    begin
      { Place thread code here }
      tempdbcreate;
      base:=Tuniquery.Create(nil);
      base.Connection:=main.main_form.local;
      while True do
      begin
      sleep(5000);
      if main.main_form.local.Connected then
        begin
          synchronize(memcount);
          if (count)>0 then
            begin
              Synchronize(updatememo);
              writeinbase;
              writeinbackup;
            end;
        end
      else begin  ///
           locstatus(1,'str');
           sleep(15000);
           end;
      end;
    end;

     

  6. Здраствуйте, не знаю в чем проблема. Поток в програме работает на моей машине, в не зависимосте как запустил програму, в среде или нет. С vcl проблем небыло, а сейчас перевел на fmx. Поток должен мониторить визуальный компонент и если нада обращаться к бд. 

    А на стороннем пк поток не запускаеться. Запускаю так.

    var
      th : SomeThread;
    begin
      th                 := SomeThread.Create;
      th.FreeOnTerminate := true;
      th.Resume;
    end;

     

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