Текущий архив: 2003.12.19;
Скачать: CL | DM;
Вниз
Проблема с TreeView, или почему приходится Найти похожие ветки
← →
PVOzerski (2003-12-05 18:29) [0]В программе использую компонент tHeTreeView - потомок tTreeView. До этого использовал стандартный tTreeView из VCL - проблема №1 была та же самая... Подозреваю, что и 2-я бы проявилась.
Суть в том, что в TreeView я закачиваю огромный (несколько тысяч) список строк, и при каждом Clear программа начинала жутко "тормозить". Я попытался сделать следующий трюк: вместо честного Clear создавать на форме в рантайме новый TreeView, а старый делать невидимым и тихонько разбирать в отдельном потоке. Кажется, что-то мне удалось ("задумчивость" программы заметно уменьшилась), но осталось чувство, что работоспособность программы держится на "шаманстве"). Суть сомнений: в коде, приведенном ниже, есть две откровенно "бессмысленные" строчки, без которых, однако, вылетает сообщение об исключении (нарушение доступа). Строчки эти я обозначаю //!!!
var
OldTree:tHeTreeView=nil;
function Killer(param:tHeTreeView):longint;stdcall;
begin
if Assigned(param)then
begin
param.Free;
param:=nil; //!!! А ведь передан параметр-то по значению, больше мы с ним не увидимся
end;
end;
procedure tFunCatForm.SearchItems(const st:string);
var
i:longint;
found:longint;
SearchRec:tSearchRec;
s,d:string;
list:tStringList;
Node:tTreeNode;
ms:string;
ID:longint;
begin
if st="" then
ms:=""
else
ms:="*"+st;
OldTree:=TreeView1;
OldTree.Parent:=nil;
OldTree.Name:="OLD"; //!!!А чем "" хуже?
TreeView1:=tHeTreeView.Create(Self);
TreeView1.ReadOnly:=OldTree.ReadOnly;
TreeView1.DragMode:=OldTree.DragMode;
TreeView1.OnChange:=OldTree.OnChange;
TreeView1.Left:=OldTree.Left;
TreeView1.Top:=OldTree.Top;
TreeView1.Width:=OldTree.Width;
TreeView1.Height:=OldTree.Height;
TreeView1.Parent:=Self;
CreateThread(nil,0,@Killer,OldTree,0,ID);
← →
Serg (2003-12-05 18:36) [1]param:=nil; //!!! А ведь передан параметр-то по значению, больше мы с ним не увидимся
передаётся реальный указатель на экземпляр класса, а никакое не значение. лучше всего освобождать объект с помощью функции FreeAndNil
← →
Skier (2003-12-05 18:38) [2]
> передаётся реальный указатель на экземпляр класса, а никакое
> не значение.
передаётся скопированный указатель на экземпляр класса !
← →
PVOzerski (2003-12-05 18:42) [3]2Serg - это правильно (BTW, в доке по CreateThread сказано, что надо передавать 32-битный параметр, так что я отдавал себе отчет в том, что имею дело с указателем). Но ведь после того, как я вызвал Free, уже не важно, указывает param куда-то или никуда, так как обращений к этому param"у нигде больше нет, и даже если функция Killer вновь будет вызвана, она возьмет из стека новое значение этого указателя.
← →
Юрий Федоров (2003-12-05 18:45) [4]Что если создавать с Owner = nil?
Причем с самого сначала ?
← →
Wizard_Ex (2003-12-05 18:47) [5]Поищи TVirtualTree
по скорости - лучшее дерево
← →
Serg (2003-12-05 18:50) [6]а в какой строке кода вылетает AV ?
← →
PVOzerski (2003-12-05 18:53) [7]2Serg:
Вообще-то ниже приведенного, когда я начинаю заполнять дерево,
на строке Node:=TreeView1.Items.AddChild(nil,s);
← →
PVOzerski (2003-12-05 18:59) [8]2Wizard_Ex:
Уже нашел :^) Только вот в доке говорится, что компонент - для D4 и выше - значит, мне из-за него проект с "тройки" переносить надо :^( Я посмотрел исходник чуть-чуть, там динамические массивы - значит, для адаптации к D3 переделывать надо - а не хочется...
← →
Serg (2003-12-05 19:10) [9]2Skier:
ну да - копируется указатель, но не сам объект
2PVOzerski:
однако, странно... исходя из приведённого кода, всё должно работать. тут потрассерить бы надо, а так (визульно) сложно сказать
← →
PVOzerski (2003-12-05 19:11) [10]В общем, пока рабочая гипотеза - неудачная оптимизация. Попробую погонять программу на разных машинах. Если будет работать устойчиво, то и ладно.
← →
nikkie (2003-12-05 19:46) [11]имхо - последствия вызова метода VCL из неосновного потока. вообще - зря Вы все это затеяли...
а не помогало просто
BeginUpdate;
try
Clear;
finally
EndUpdate;
end;
?
Страницы: 1 вся ветка
Текущий архив: 2003.12.19;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c