Главная страница
    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.014 c
2-1149199309
Tigraman
2006-06-02 02:01
2006.06.25
Работает ли пользователь за компьютером?


2-1149596976
mfender
2006-06-06 16:29
2006.06.25
TWebBrowser: найти и удалить элемент


2-1149510361
XTD
2006-06-05 16:26
2006.06.25
Invalid floating point operation Исключение класса ElnvalidOp


15-1148570205
Kapoo
2006-05-25 19:16
2006.06.25
Молю, помогите с курсовой!..


3-1146477632
kilonet
2006-05-01 14:00
2006.06.25
Какие локальные БД позволяют хранить таблицу в нескольких файлах?





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