Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
2-1245325239
Дима
2009-06-18 15:40
2009.08.16
Таймер


15-1245249210
Rouse_
2009-06-17 18:33
2009.08.16
Есть кто знающий хорошо РНР?


15-1245123478
DelphiN!
2009-06-16 07:37
2009.08.16
Установка новых устройств под учеткой с правами пользователя


15-1245308606
тимохов
2009-06-18 11:03
2009.08.16
Ограничения VS 2088 Express и MSSQL Server 2008 Express


1-1211988241
lazanor
2008-05-28 19:24
2009.08.16
подключение Mathcad или Mathematica к Delphi