Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
2-1149774642
Nikolaich
2006-06-08 17:50
2006.06.25
Как программно переместить splitter?


15-1148288235
atmospheric
2006-05-22 12:57
2006.06.25
Литература для начинающих Delphi?


1-1147986841
Германн
2006-05-19 01:14
2006.06.25
Установка Indy9 на Д6


15-1148986185
Dzhin
2006-05-30 14:49
2006.06.25
Йога


3-1146202792
vltorax
2006-04-28 09:39
2006.06.25
group by хелп





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