Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.019 c
6-62170
Avsam
2003-10-23 13:59
2003.12.19
TIdHTTP и прокси


14-62225
SkyRanger
2003-11-24 08:15
2003.12.19
MelcoSoft :D ничего не меняется...


1-62048
Pesh
2003-12-05 23:03
2003.12.19
определение выходного дня


6-62177
Djoniki
2003-10-22 20:11
2003.12.19
Подбор цифр !!!!!!!!!!!!!!!!!!!!!!


1-62076
Ил_204
2003-12-09 09:51
2003.12.19
Версия проекта