Главная страница
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.076 c
2-1149601035
leito
2006-06-06 17:37
2006.06.25
Вывод в EXCEL


1-1147893773
Damager
2006-05-17 23:22
2006.06.25
Надписи на кнопках ToolBar


4-1143199326
slaga
2006-03-24 14:22
2006.06.25
Как получить ссылку на работающий Thread имея его ID


15-1148799929
Ega23
2006-05-28 11:05
2006.06.25
Ñ Äíёì ðîæäåíèÿ! 28 мая


3-1145967623
Express
2006-04-25 16:20
2006.06.25
TDBGrid - номер текущей записи и всего записей в таблице