主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

删除对象时出错 找到类似的分支


TTCustomDelphiMaster   (2002-07-16 21:06) [0]

Уважаемые коллеги помогите разобраться с ошибкой в программе.
О программе: У некоего объекта (TbaseObj) и его потомков имеется множество визуальных изображений (похожих на TTreeNode, TtreeView, Tlabel и т.д.). Через этот объект осуществляется управление изображениями.
О проблеме: При сворачивании ветви TtreeView происходит массовое удаление визуальных изображений, что в свою очередь приводит массовому к удалению самих объектов (см. procedure TBaseObj.DelVisObj(VisObj: TObject);). В некоторых случаях это приводит к ошибке AV adress 004a7cf2 read of aderess FFFFFFFF ... Какую то закономерность появления этой ошибки определить не удается.
Мне кажется что метод ClearDelList вызывается парралельно несколько раз. Один из них уже удалил DelList[0], а второй пытается обратиться к этому объекту и при этом возникает ошибка.
Ошибку эту удалось побороть установкой временной задержки с использованием таймера (отсюда и появился Sender: Tobject), при этом ClearDelList вызывается только один раз после последнего сообщения WM_ClearDelList. Таймер и все что к нему прилагается я временно вырезал.
Внимание вопросы:
Может ли ClearDelList вызываться Windows или процессором параллельно?
Есть ли идеи как по другому организовать удаление?



TTCustomDelphiMaster   (2002-07-16 21:09) [1]

Вырезки из программы:

TUniversalList = class
FormHandle: HWND;
Deleting: boolean;
NotVisList: TObjectList;
DelList: TObjectList;
TabMenager: TTableMenager;
DelTimer: TTimer;
constructor CreateHND(FormHND: HWND; TabMen: TTableMenager);
function AddVisObj(VisObj: TObject; Idn: integer; KodType: integer): TBaseObj;
procedure ClearDelList(Sender: TObject);
end;

// Базовый класс
TBaseObj = class
FormHandle: HWND;
DelList: TObjectList;
ParentRange: TObjGrup;
ChildRange: TObjGrup;
Idn: integer;
Num: integer;
KodType: integer;
IdnInfo: integer;
SourceTable: TTable;
InfoTable: TTable;
VisObjList: TObjectList;
// procedure ChangeParam(); virtual; // Изменение свойств объекта
constructor CreateObj(TabMan: TTableMenager; ParentIdn: integer; ParentKodtype: integer); virtual;
constructor HideCreate(TabMan: TTableMenager; Idnobj: integer); virtual;
procedure ShowProperty(); virtual;
procedure DelVisObj(VisObj: TObject);
function GetName(): string;
procedure SetVisObj(com: integer; param: integer);
end;



procedure TUniversalList.ClearDelList(Sender: TObject); // на sender не стоит обращать внимания
begin
if (not Deleting) and (DelList.Count > 5) then
begin
Deleting := True;
while DelList.Count <> 0 do
begin
if ((DelList[0] as TBaseObj).VisObjList.Count = 0) then // здесь останавливается программа при ошибке
begin
NotVisList.Remove(DelList[0]);
DelList.Delete(0);
end
else
begin
DelList.Delete(0);
end;
end;
Deleting := False;
end;
end;

procedure TForm2.WndProc(Var Msg:TMessage);
begin
If Msg.Msg=WM_ClearDelList then
begin
GUnList.ClearDelList(nil);
end;
inherited;
end;

procedure TBaseObj.DelVisObj(VisObj: TObject);
begin
VisObjList.Remove(VisObj);
if VisObjList.Count = 0 then
begin
DelList.Add(Self);
PostMessage(FormHandle, WM_ClearDelList, 0, 0);
end;
end;



TTCustomDelphiMaster   (2002-07-16 23:01) [2]

Нашел ошибку!!! Да, такую весчь задумал, что все тонкости реализации в одной голове не укладываются. Иногда бывает полезно делать перерывы в работе над проектом. Когда к нему возвращаешься смотришь на него совсем по другому. Вот и в этом проекте неделю искал ошибку, даже какие-то невероятно тупые гипотизы появились, а спустя два месяца сел и за семь минут проблема решена.



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上









内存:0.56 MB
时间:0.022 c
14-95499
JohnnyJ
2002-06-30 23:00
2002.07.29
建议采取哪种电视调谐器


7-95576
KPbIC
2002-05-12 03:46
2002.07.29
启用/禁用设备


1-95320
_Alex_
2002-07-17 22:47
2002.07.29
StringGrid排序


1-95384

2002-07-15 11:42
2002.07.29
创建


3-95229
阿尔乔姆
2002-07-08 15:15
2002.07.29
如何从表中读取数据,由存储的表返回。





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский