Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
ВнизAV при доступе к объекту из потока Найти похожие ветки
← →
antonn © (2009-06-19 00:09) [0]Запутался слегка, одну вещь не пойму.
Работаю с потоками (tthread). Есть два класса и поток:
1. TBTTextureList - в котором есть FList:TList (живет вместе с классом от создания до смерти)
у него есть функция (возвращает число записей в листе):function TBTTextureList.GetCount:integer;
begin
result:=FList.Count;
end;
2. TDModel - в нем есть Fbitmaps:TBTTextureList (живет вместе с классом от создания до смерти)
и функция возвращающая число записей в Fbitmaps (выше):function TDModel.GetCountTexture:integer;
begin
result:=Fbitmaps.GetCount;
end;
procedure TDModel.CreateThread;
begin
FModelLoadThread:=TModelLoadThread.Create(true,1);
FModelLoadThread.FDModel:=self;
FModelLoadThread.Resume;
end;
3. TDModel создает поток TThread, у которого это:procedure TModelLoadThread.Execute;
begin
Synchronize(SendBitmap);
end;
procedure TModelLoadThread.SendBitmap;
begin
FDModel.GetCountTexture;
end;
Сама фигня - при обращении к FDModel.Fbitmaps.Flist в SendBitmap вываливается AV. Почему? Не из потока без проблем работаю с ним. Как правильно к нему обратиться? (поток должн вызвать пару методов того TDModel, который его создал)
Пробный проект: http://desksoft.ru/index.php?downloads=attachments&id=193 (5кб, zip)
← →
Игорь Шевченко © (2009-06-19 00:25) [1]нету AV, в Caption появляется 1
← →
Игорь Шевченко © (2009-06-19 00:32) [2]Впрочем, одна фигня есть.
FDModel:=TDModel.Create;
try
caption:=inttostr(FDModel.Fbitmaps.GetCount );
FDModel.CreateThread;
finally
FDModel.free;
end;
после FModelFree поток еще продолжает работать, и обращается к методу
Synchronize(SendBitmap);
А FModel уже удалена. Поток обращается к методам и свойствам освобожденного объекта, и результат непредсказуем. Мне повезло, AV нет, тебе не повезло, AV есть
← →
antonn © (2009-06-19 00:33) [3]перезагрузил комп, на Дельфи 7 "Access Violation at adress 0044DF04 in module priject1.exe" и курсор показывает на:
function TBTTextureList.GetCount:integer;
begin
result:=FList.Count;
end;
WinXP Pro 32bit
:(
← →
antonn © (2009-06-19 00:35) [4]
> Игорь Шевченко © (19.06.09 00:32) [2]
действительно, оно и есть, совсем заработался, пол проекта раздербанил в ноль :)
← →
Игорь Шевченко © (2009-06-19 00:39) [5]antonn © (19.06.09 00:35) [4]
Кысмет
← →
Германн © (2009-06-19 01:08) [6]1.
> antonn © (19.06.09 00:35) [4]
> раздербанил в ноль
2.
> Игорь Шевченко © (19.06.09 00:39) [5]
>
> antonn © (19.06.09 00:35) [4]
>
> Кысмет
>
Это что? Шифровка типа Юстас-Алексу/ Алекс-Юстасу?
:?
← →
Игорь Шевченко © (2009-06-19 01:14) [7]Германн © (19.06.09 01:08) [6]
http://www.stihi.ru/avtor/nekrozis
← →
Германн © (2009-06-19 01:21) [8]
> Игорь Шевченко © (19.06.09 01:14) [7]
>
> Германн © (19.06.09 01:08) [6]
Твой код я понял. :)
Теперь жду расшифровки ответа Антона antonn © (19.06.09 00:35) [4]
:)
← →
sniknik © (2009-06-19 01:21) [9]> procedure TModelLoadThread.Execute;
> begin
> Synchronize(SendBitmap);
> end;
последователь Архангельского... а нафига нужен поток?
← →
antonn © (2009-06-19 01:26) [10]
> Германн © (19.06.09 01:08) [6]
да я в общем то тоже не понял :)
обиднее всего, что как раз для отладки этого TDModel делал отдельный экземпляр создающийся по кнопочке по всем правилам с try..finally (в проекте он не уничтожается), потерял часа 4, перешерстил 8 классов (мало ли, мож в них кто нибудь память неверно выделялась или еще чего) и в итоге вырезал минимум, с этим минимумом смотрел как баран на ворота - "не ну правильно ведь!", до буквочки переглядел. А оно вона как, предательски повернулось %)
← →
antonn © (2009-06-19 01:28) [11]
> sniknik © (19.06.09 01:21) [9]
>
> > procedure TModelLoadThread.Execute;
> > begin
> > Synchronize(SendBitmap);
> > end;
> последователь Архангельского...
не надо так опрометчиво.
Так устроит? Там еще примерно таких же по объему и кол-ву ненужных вещей для данного примера функций 5-6.procedure TModelLoadThread.Load_from_memory(var Mi:TMemoryStream);
var i,ii:integer; bt_main,bt_bump,bt_tmp,bt_tmp_assign,bt_tmp_assign_bump:tbt;
FBTList:TBTTextureList; a:double; FBTFX:TBTFX; FBTList_result:TBTTextureList;
begin
FBTList:=TBTTextureList.Create;
bt_main:=TBT.Create;
bt_bump:=tbt.Create;
bt_tmp:=tbt.Create;
bt_tmp_assign:=tbt.Create;
bt_tmp_assign_bump:=tbt.Create;
FBTFX:=TBTFX.Create;
FBTList_result:=TBTTextureList.Create;
try
FBTList.Load_from_memory(Mi);
inc_send:=0;
for i:=0 to FBTList.GetCount-1 do begin
FBTList.GetBitmap(i).Texture.GetTexture.MakeCopyDest(bt_main);
FBTList.GetBitmap(i).Texture.GetBump.MakeCopyDest(bt_bump);
bt_tmp.SetSize(bt_main.DIBWidth*4,bt_main.DIBHeight*4);
bt_tmp.GD_FillColor(clblack);
bt_main.Draw_resize(bt_tmp,0,0,bt_tmp.DIBWidth,bt_tmp.DIBHeight,clblack);
bt_main.MakeCopy(bt_tmp);
bt_tmp.SetSize(bt_bump.DIBWidth*4,bt_bump.DIBHeight*4);
bt_tmp.GD_FillColor(clblack);
bt_bump.Draw_resize(bt_tmp,0,0,bt_tmp.DIBWidth,bt_tmp.DIBHeight,clblack);
bt_bump.MakeCopy(bt_tmp);
for ii:=0 to FCOUNT_ROTATE_FRAMES-1 do begin
a:=ii*(pi*2)/FCOUNT_ROTATE_FRAMES;
bt_tmp.GD_FillColor(clblack);
bt_main.Draw_rotate_alpha(bt_tmp,(bt_tmp.DIBWidth div 2),(bt_tmp.DIBHeight div 2),(bt_tmp.DIBWidth div 2),(bt_tmp.DIBHeight div 2),a);
bt_tmp_assign.GD_Assign_Antialias4X(bt_tmp);
bt_tmp.GD_FillColor(clblack);
bt_bump.Draw_rotate_alpha(bt_tmp,(bt_tmp.DIBWidth div 2),(bt_tmp.DIBHeight div 2),(bt_tmp.DIBWidth div 2),(bt_tmp.DIBHeight div 2),a);
bt_tmp_assign_bump.GD_Assign_Antialias4X(bt_tmp);
SendBTexture.GetTexture.MakeCopy(bt_tmp_assign);
SendBTexture.GetBump.MakeCopy(bt_tmp_assign_bump);
SendBTexture.SetBumping(true);
SendBTexture.Pressed_bump(FBTFX);
Synchronize(SendBitmap);
end;
end;
finally
FBTList.Free;
bt_main.Free;
bt_bump.free;
bt_tmp.free;
bt_tmp_assign.free;
FBTFX.free;
FBTList_result.free;
bt_tmp_assign_bump.free;
end;
end;
procedure TModelLoadThread.Execute;
begin
Load_from_memory(fm1);
end;
procedure TModelLoadThread.SendBitmap;
begin
FDModel.AddTexture_2_bitmap(SendBTexture);
FDModel.FLoading:=2;
end;
← →
Германн © (2009-06-19 01:32) [12]
> antonn © (19.06.09 01:26) [10]
>
>
> > Германн © (19.06.09 01:08) [6]
>
> да я в общем то тоже не понял :)
>
> обиднее всего, что как раз для отладки этого TDModel делал
> отдельный экземпляр создающийся по кнопочке по всем правилам
> с try..finally (в проекте он не уничтожается), потерял часа
> 4
Не хочу слыть рекламным агентом. Но ещё раз рекомендую Эврику.
← →
antonn © (2009-06-19 01:38) [13]
> Но ещё раз рекомендую Эврику.
а что это?
под "отладкой" я написал проверку работовпособности по шагам - функция грузит текстуру и поворачивает ее, я просто в цикле сохранял на диск повернутое и смотрел, действительно ли оно поворачивает и в какую сторону. Просто удобнее было отдельным экземпляром, чем создавать всю сцену и ждать каждый раз загрузки и инициализции всей внутренней мишуры. Утечек у меня вроде как давно небыло, педантично создаю и удаляю все что создал, за что и поплатился :)
← →
Германн © (2009-06-19 01:48) [14]
> antonn © (19.06.09 01:38) [13]
>
>
> > Но ещё раз рекомендую Эврику.
>
> а что это?
>
EurekaLog.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c