![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TKOLThread - ошибка ?
GMax © (2005-10-13 10:02:00)пишу программку с нитями.
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;
я не прав ?
GMax (2005-10-15 17:51:00) [1]её очень хорошо удаётся перераспределить, если использовать onDestroy совместно с AutoFree
или Synchronize() в конце Execute
Vladimir Kladov (2005-10-15 16:16:00) [2]я поправлю. Конечно так делать не стоит, получается запись в память, которая уже освобождена. Если удалось успеть ее перераспределить между Free и :=, то бяка и получается. Там вообще один раз достаточно Terminated := true, до проверки AutoFree.
ECM (2005-10-15 15:13:00) [3]Я наверное не так выразился ... :)
> ты попробуй повыделять память побольше и поосвобождать её.
Это я понял уже после того как запостил.
ИМХО: Я думаю это
...
FTerminated := TRUE; // thread marks itself that it is terminated
if F_AutoFree then Free;
...
корректнее того что есть сейчас ... и главное компактнее....
Совет: Составьте подробное описание ситуации и способ устранения и в мыло Владимиру... в теме укажите "KOL - Bug report"
GMax (2005-10-15 13:57:00) [4]конечно тут падений нету, ты особо ничего и не делаешь :)
ты попробуй повыделять память побольше и поосвобождать её.
да ещё синхронизацию вставь.
конкретно у меня выделяется память под массив строк, а потом они вставляются при синхронизации в RichEdit, который наверяка тоже себе памяти берёт при этом. и падает не каждый раз, а иногда - как повезёт.
и всё же, в чём я не прав по сути ?
ECM (2005-10-14 13:39:00) [5]
> thTest := NewThread(); // Start Suspensed
thTest := NewThread(); // Start Suspen ded
:)
ECM (2005-10-14 13:23:00) [6]
> я не прав ?
Ответ скорее положительный:
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;
Никаких падений - сколько не запускай! ...:)