Главная страница
    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.46 MB
Время: 0.011 c
1-1147688524
Tempora
2006-05-15 14:22
2006.06.25
Как определить является ли папка символической ссылкой?


2-1149614650
Mr tray
2006-06-06 21:24
2006.06.25
Нужно ли выделять память для #0 в null-terminated string


2-1149567037
Id
2006-06-06 08:10
2006.06.25
Загрузка из *.doc или *.rtf


2-1149575281
Perf2k2
2006-06-06 10:28
2006.06.25
Не видит глобальную переменную


4-1143474014
ZeBriD
2006-03-27 19:40
2006.06.25
Перехват содержимого TMemo другой программы





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