Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];

Вниз

Проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
14-62261
wal
2003-11-25 10:15
2003.12.19
Новый вид спама


6-62180
kosha80
2003-10-23 13:31
2003.12.19
Как послать GET запрос с параметрами


14-62235
Rauf
2003-11-25 02:01
2003.12.19
Способы описания метаданных


7-62298
Nikk
2003-10-13 17:55
2003.12.19
Передача через ИК порт


14-62246
UPR
2003-11-25 15:15
2003.12.19
Как отправить сообщение на мыло без помощи Аутлук и т.п.?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский