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

Вниз

TKOLThread - ошибка ?   Найти похожие ветки 

 
GMax   (2005-10-13 10:02) [0]

пишу программку с нитями.
AutoFree=True.

при нескольких последовательных запусках рассчёта программа роняется вот тут:

function TThread.Execute: integer;
begin
 Result := 0;
 if Assigned( FOnExecute ) then
    Result := FOnExecute( @Self );
 if F_AutoFree then
 begin
   FTerminated := TRUE; // fake thread object (to prevent terminating while freeing)
   Free;
 end;
->>>>>>>>>>
ACCESS VIOLATION>>>  FTerminated := TRUE; // thread marks itself that it is terminated
->>>>>>>>>>
end;

что на мой взгляд вполне логично.
объект-то уже освобождён, поэтому присвоение FTerminated последней строчкой не в тему.
мне кажется это место должно выглядеть вот так:

function TThread.Execute: integer;
begin
 Result := 0;
 if Assigned( FOnExecute ) then
    Result := FOnExecute( @Self );
 FTerminated := TRUE; // thread marks itself that it is terminated
 if F_AutoFree then Free;
end;

я не прав ?


 
ECM ©   (2005-10-14 13:23) [1]


> я не прав ?

Ответ скорее положительный:

procedure TForm1.Button1Click(Sender: PObj);
var
 thTest: PThread;
begin
 thTest := NewThread(); // Start Suspensed
 thTest.AutoFree := TRUE;
 thTest.OnExecute := Thread1Execute;
 thTest.Resume;
end;

function TForm1.Thread1Execute(Sender: PThread): Integer;
var
 i: Integer;
begin
 for i:= 0 to 9 do begin
   MessageBeep(MB_ICONASTERISK);
   Sleep(500);
 end;
end;


Никаких падений - сколько не запускай! ...:)


 
ECM ©   (2005-10-14 13:39) [2]


> thTest := NewThread(); // Start Suspensed


thTest := NewThread(); // Start Suspended
:)


 
GMax   (2005-10-15 13:57) [3]

конечно тут падений нету, ты особо ничего и не делаешь :)
ты попробуй повыделять память побольше и поосвобождать её.
да ещё синхронизацию вставь.

конкретно у меня выделяется память под массив строк, а потом они вставляются при синхронизации в RichEdit, который наверяка тоже себе памяти берёт при этом. и падает не каждый раз, а иногда - как повезёт.

и всё же, в чём я не прав по сути ?


 
ECM ©   (2005-10-15 15:13) [4]

Я наверное не так выразился ... :)

> ты попробуй повыделять память побольше и поосвобождать её.

Это я понял уже после того как запостил.
ИМХО: Я думаю это
...

 FTerminated := TRUE; // thread marks itself that it is terminated
 if F_AutoFree then Free;

...
корректнее того что есть сейчас ... и главное компактнее....
Совет: Составьте подробное описание ситуации и способ устранения и в мыло Владимиру... в теме укажите "KOL - Bug report"


 
Vladimir Kladov   (2005-10-15 16:16) [5]

я поправлю. Конечно так делать не стоит, получается запись в память, которая уже освобождена. Если удалось успеть ее перераспределить между Free и :=, то бяка и получается. Там вообще один раз достаточно Terminated :=  true, до проверки AutoFree.


 
GMax   (2005-10-15 17:51) [6]

её очень хорошо удаётся перераспределить, если использовать onDestroy совместно с AutoFree
или Synchronize() в конце Execute



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.06 c
2-1149773038
AlexanderMS
2006-06-08 17:23
2006.06.25
Русификация сообщений об ошибках


3-1146207610
Некто
2006-04-28 11:00
2006.06.25
X*Y*H


15-1149208471
TButton
2006-06-02 04:34
2006.06.25
(JS) mouse event в FireFox


2-1149505921
FiJer
2006-06-05 15:12
2006.06.25
Как можно выровнить текст в Edit по вертикали?


2-1149653166
Rubey
2006-06-07 08:06
2006.06.25
Ошибка с полем MEMO