Форум: "KOL";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "KOL";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c