freepascal.ru • Просмотр темы - TreeView странность.
 

TreeView странность.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: TreeView странность.

Сообщение wofs » 31.08.2017 17:38:02

vitaly_l писал(а):Там не должно быть никакой задержки, если всё правильно сделать.

Собственно за этим я сюда и пришел :) Не очень люблю велосипеды.
Беру тайм-аут на пару дней для осмысления сказанного выше.

Добавлено спустя 1 минуту 27 секунд:
vitaly_l писал(а): у вас начинает всё работать, через 100 мс.


Кстати, уменьшил задержку вплоть до 1мс - все работает. Видимо главное вызывать очистку не из обработчика событий TreeView, как впрочем и говорили выше.
Аватара пользователя
wofs
постоялец
 
Сообщения: 372
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение zub » 31.08.2017 17:43:58

vitaly_l
>>осле того, как станет понятно что, на работу с БД требуется время,
Время требуется на любую работу. Или ты думаешь что стоит сделать uses ...SQLчтототам... программа начнет жить по особым чудесным законам?
>>сделать vangamode:=off
как только ТС уберет ненужные зависимости из "простого" примера...
>>т.к. БД - сама за собой всё почистит.
Блажен кто верит))

wofs
>>А вот если очистку и заполнение вызывать из таймера 100мс, то все ок.
ненадо тут никакого таймера, нужен асинхронный вызов процедур очистки и заполнения в случае если ты хочешь выполнить их из метода очищаемого и заполняемого тривива.
Т.к. примера нормального у тебя нет, дам абстрактный но суть абсолютно таже:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private

  public
    procedure AsyncButtonFree(Data: PtrInt);

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.AsyncButtonFree(Data: PtrInt);
begin
  Button1.free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.free;//так нельзя, закоментируй, раскоментируй следующую строку
  //Application.QueueAsyncCall(@AsyncButtonFree,0);
end;

end.

у тебя AsyncButtonFree ессно будет называться подругому, и содержвть будет не
Код: Выделить всё
Button1.free;

а
Код: Выделить всё
         Clear();
         FillTree();


Добавлено спустя 2 минуты:
в зависимости от режима компиляции (objfpc или delphi) в Application.QueueAsyncCall(@AsyncButtonFree,0); собака может понадобиться а может нет

Добавлено спустя 1 минуту 40 секунд:
суть в том что QueueAsyncCall ставит переданые адреса процедур в очередь, и после обработки всех сообщений, перед уходом в idle (передачей выполнения оси) они выполняются
zub
долгожитель
 
Сообщения: 2412
Зарегистрирован: 14.11.2005 23:51:26

Re: TreeView странность.

Сообщение vitaly_l » 31.08.2017 18:22:09

zub писал(а):Время требуется на любую работу.

Я же говорю, отключи "чёртов" вангамодуль - перегреется, же не дай бог.
zub писал(а):QueueAsyncCall ставит переданые адреса процедур в очередь

ну вот, что и требовалось доказать :roll: - это было интересно и познавательно, т.к. я бы решал такую задачу созданием и удалением новых ptr.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TreeView странность.

Сообщение olegy123 » 01.09.2017 02:20:39

Никакой странности не должно быть.
Процессы однопоточны.
Нужно тестить на протечку памяти.
olegy123
энтузиаст
 
Сообщения: 949
Зарегистрирован: 25.02.2016 12:10:20

Re: TreeView странность.

Сообщение Лекс Айрин » 01.09.2017 09:13:36

olegy123, ты сам сказал процессы. А уж организация связи между ними может быть разной.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: TreeView странность.

Сообщение serbod » 01.09.2017 12:02:08

wofs, в обработчике изменения узла ты удаляешь изменяемый узел и вообще все узлы. Вот что получается при вызове обработчика:
Код: Выделить всё
      Node:=FEditingItem;
      if (Node<>nil) then begin
        if Assigned(OnEdited) then
          OnEdited(Self,Node,NewText);
        Node.Text:=NewText;  // А Node уже удалили!
      end;
Аватара пользователя
serbod
постоялец
 
Сообщения: 294
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: TreeView странность.

Сообщение wofs » 01.09.2017 12:20:23

zub писал(а):суть в том что QueueAsyncCall ставит переданые адреса процедур в очередь,

А указанный вами метод работает!
И, главное, я понял суть проблемы - спасибо!

ps. Как же все сильно проще в мире МК...

Добавлено спустя 45 секунд:
Собственно спасибо всем - суть ясна, одно из решений найдено.
Аватара пользователя
wofs
постоялец
 
Сообщения: 372
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение olegy123 » 01.09.2017 13:41:55

Лекс Айрин писал(а):olegy123, ты сам сказал процессы. А уж организация связи между ними может быть разной.

Даже TThread синхронизируется с главным потоком, чтобы не было конкуренции за ресурсы.. Чтобы у начинающего программиста не было неоднозначности по поводу выполения программ с TThread и не ловил except в разных местах.

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

Добавлено спустя 5 минут 11 секунд:
wofs писал(а):И, главное, я понял суть проблемы - спасибо!

Советуют переменную нулить, при освобождении: FreeAndNull(object);
Потому, что с Nil(NULL) не работают. И при отладки программа сама подскажет что в этом объекте nil, а не использованный мусор, который может быть еще рабочим.
olegy123
энтузиаст
 
Сообщения: 949
Зарегистрирован: 25.02.2016 12:10:20

Re: TreeView странность.

Сообщение Лекс Айрин » 01.09.2017 14:52:09

olegy123 писал(а):Даже TThread синхронизируется с главным потоком, чтобы не было конкуренции за ресурсы..


не после каждого оператора(((

olegy123 писал(а): Зачем нужна атомарность, блокировки, ожидания.

Это как раз примитивно. Выполнение задачи делится на относительно независимые части. Если выполнение какого-нибудь потока невозможно, то он блокируется и выполняется переход на другой, а текущий переводится в режим ожидания. Если нужный ресурс недоступен (захвачен другим потоком), то тоже идет блокировка.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: TreeView странность.

Сообщение vitaly_l » 01.09.2017 16:15:03

wofs писал(а):И, главное, я понял суть проблемы - спасибо!

Да?
Тогда объясните пожалуйста, зачем Вы два раза подряд "чистите" Tree1.Items?
Код: Выделить всё
with Tree1 do
begin
   for  i:=Items.Count-1 downto 0 do
   begin
        Items[i].Data:=nil;
        Items[i].Free;
   end;
end;   
//и затем тут же в procedure FillTree(); снова чистите Tree1
Tree1.Items.Clear;

С какой целью два раза подряд "чистится" Tree1.Items?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TreeView странность.

Сообщение wofs » 02.09.2017 10:47:30

vitaly_l писал(а):Да?
Тогда объясните пожалуйста, зачем Вы два раза подряд "чистите" Tree1.Items?

Дело было так.
В процедуре заполнения по привычке сперва очищаю компонент
Код: Выделить всё
Tree1.Items.Clear

Все заполняется, работает - ок.
Добавляем редактирование ветки и обнаруживается проблема.
Начинаю курить интернет - наткнулся на проблемы с
Код: Выделить всё
Tree1.Items.Clear
, мол даты не подчищает. Думаю не вопрос - почищу сам, а
Код: Выделить всё
Tree1.Items.Clear
так и осталось в процедуре заполнения.
Был удивлен отсутствию результата и пишел сюда.
Суть проблемы я уяснил. Если бы я писал код под МК, то аналогичная ситуевина была бы в функции, где очень важна атомарность, а я на нее забил. И, МК, улетя по архиважному прерыванию набедокурил в регистрах, а вывалившись вновь в функцию как ни в чем не бывало цепанул этот мусор и получился бы трабл, причем непостоянный и жутко геморойный в отладке.

vitaly_l писал(а):С какой целью два раза подряд "чистится" Tree1.Items?

Остаток от поисков проблемы, не более того. В рабочем проекте процедуры
Код: Выделить всё
Clear();
вообше не будет, так как с задачей прекрасно справляется
Код: Выделить всё
Tree1.Items.Clear
.
Просто в коде процедуру
Код: Выделить всё
FillTree();
буду вызывать через QueueAsyncCall
Аватара пользователя
wofs
постоялец
 
Сообщения: 372
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение vitaly_l » 02.09.2017 11:00:56

wofs писал(а):мол даты не подчищает.

Вот, видите: слышите звон, но не знаете где он.

Повторяю: Вы data - не создавали ( не пользовались new(); при создании pntr ) - поэтому вам их чистить и ненужно, там всё без Вас чистится. И это является вашей ошибкой, т.к. то что код работает - это временное совпадение, т.к. адреса просто не успевают затереться в памяти. И поэтому иногда проскакивает "странный результат" из прошлого цикла.

Понимаете или нет?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TreeView странность.

Сообщение Лекс Айрин » 02.09.2017 11:45:39

vitaly_l писал(а): Вы data - не создавали ( не пользовались new(); при создании pntr ) - поэтому вам их чистить и ненужно, там всё без Вас чистится.


А ты уверен, что он их не создавал? Ведь откуда то они взялись? И, если уж на то пошло, то дерево (и его пункты тоже) это это элементы класса, а не объекты, а значит, при их создании New не используется. И указатель создавать тоже не надо.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Re: TreeView странность.

Сообщение vitaly_l » 02.09.2017 11:52:31

Лекс Айрин писал(а):А ты уверен, что он их не создавал? Ведь откуда то они взялись?

А Вы у Ванги спросите: "создавал или не создавал?", тем более что, вагинатор ещё включен и вангамодуль ещё работает, т.к. Zub его не отключил. Соответственно прямая связь с Вангой ещё в действии, хоть и перегревается от длительного использования.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TreeView странность.

Сообщение Лекс Айрин » 02.09.2017 12:14:40

vitaly_l, то, что компилятор берет на себя часть скучной работы еще не означает, что она не делается... и к Ванге ходить не надо.

И нечего на, Zub-а бочку катить. Вагинатор тут ни при чем -- он просто исследовал код и, если надо, немного его правил под себя. Естественно, что он знает поведение компонент лучше нас.
Ну а то, что человек повелся на предположение, что data не очищается сразу... скажи, а что он мог еще подумать? Вот только не стоит заливать, что не очищенную память -- если ссылки поправлены, то для программы переменная исчезла. Конечно, если не использовать прямой доступ к памяти и внешние повисшие ссылки (что есть грубое нарушение "правил безопасности").
И, кстати, ничего странного нет, если удаление под происходит не сразу -- это вполне нормальная практика, используемая для ускорения работы. ("физически" очистить переменную проще после того как дерево будет отображено и тормоза не будут так влиять на работу пользователя. Более того, иногда проще вообще чистить дерево только при сохранении его на внешний носитель).

Так что все не так примитивно, как тебе кажется.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4200
Зарегистрирован: 19.02.2013 16:54:51

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], MailRu[bot], Yandex [Bot] и гости: 8

Рейтинг@Mail.ru