Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.008 c
15-1245161138
@!!ex
2009-06-16 18:05
2009.08.16
Консолька роняет прилоэение на выходе.


15-1245168007
Kerk
2009-06-16 20:00
2009.08.16
Ложь


15-1245344854
Alf
2009-06-18 21:07
2009.08.16
Проблемы с сеткой. Видно только свой сегмент


1-1211907969
Smart
2008-05-27 21:06
2009.08.16
Нужен алгоритм.


15-1245179158
Cyrax
2009-06-16 23:05
2009.08.16
Как называется крутилка с цыфырками на командирских часах ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский