теч памет с конци
# XA0; TMyThread = клас (TThread)
# XA0; частен
# XA0 защитена
# XA0; # XA0; процедура Изпълнение; отменят;
# XA0; обществен
процедура TMyThread.Execute;
започвам
# XA0; FreeOnTerminate: = True;
приключи;
процедура TForm1.Button1Click (Sender: TObject);
започвам
# XA0; TMyThread.Create (False) .Terminate;
приключи;
В този случай, деструктор няма да работи, както и Execute. Просто имам ситуация, в която в някои условия на потока може да работи минута и потока може да работи много бързо, и Execute не успяват да се изпълни за друг вход.
С цел да се предотврати отклоняването съм блокиран AfterConstruction и тази процедура е добавил Sleep низ (300).
Има ли някой се срещат сходни. Как да се борят за?
FreeOnTerminate: = True; което трябва да направите, за да прекрати;
> Destructor няма да работи
> Както Изпълнение
И изпълнява да работи.
> Памет течащ при работа с конци
Не че няма изтичане.
Какво е поток? Sozdavaymy? Оказва се, че на Изпълняват все още изпълнена, отново "поток може да работи"?
> Може да работи много бързо, # XA0; Изпълнение и нямат време да се изпълни
няма време да се работи - това е като? Нямате време да работи като доброволец? И това, което той всъщност е създаден, ако не и за извършване на # XA0 Извършвайте?
Zchem този "пример": # XA0; TMyThread.Create (False) .Terminate;
Задайте FreeOnTerminate да е вярно, ако не искате изрично да унищожи конци, след като завърши изпълнението.
и # XA0; TMyThread.Create (False) .Terminate; нямате нищо против да го направи изрично.
Теч тогава какво? Фактът, че той е убит, преди да може да осъществява Execute?
По принцип, винаги съм имал усещането, че потокът Execute започва още преди завършването на обекта конструктор на Делфи, ако това е посочено TMyThread.Create (False)
Не е задължително, но е възможно. Всичко зависи от това как планировчика на системата конец разпредели времеви интервали между потока и движението, причинено строителя, който се създава в този конструктор.
Прекратяване комплекти конци "S прекратения собственост на True. Ако сте реализира метода на Execute правилно, тя проверява Прекратен имота периодично, и спира изпълнението, когато Прекратен е вярно.
и прекратява # XA0, то не е unchtozhenie конец и флаг номинацията, която трябва да се третират по изпълни. така че от Execute не ходя никъде.
Най-малко проверка на кода.
Какво да го проверите?
Не няма загуби и не може да бъде, и деструктор, за да изпълнявате работата се оправи, защото той не е имал предпоставки.
Можете тества кода [0]? Не? Но аз тествани. С FastMM4. Това мениджър няма да излъже.
Аха. И тази "програма за управление" Точно както казах до тебе да кажат, изпълнение и да унищожи методи не са поканени, така че има. Или е otsebyachena на базата на спекулации, а не факти?
> Или е otsebyachena на базата на спекулации, а не факти
>?
Тази "otsebyachena" въз основа на факти. Проверете сами в края на краищата.
деструктор TMyThread.Destroy;
започвам
# XA0; наследява;
# XA0; Windows.Beep (500, 100);
приключи;
На какви доказателства, тогава. По-конкретно?
> Ако чуете zvuchek
Какво детска градина с "инвазия звуци"?
Говориш за вградената в Делфи дебъгер чух # XA0;?
функция ThreadProc (Тема: TThread): цяло число;
Var
# XA0; FreeThread: булева;
започвам
# XA0; ако Thread.FSuspended след sem_wait (Thread.FCreateSuspendedSem);
# XA0; опитате
# XA0; # XA0; ако не Thread.Terminated след това
# XA0; # XA0; опитате
като нишката вече при създаването на прекратени, а след това на Execute, разбира се, не е доволен
# XA0; # XA0; # XA0; Thread.Execute;
# XA0; # XA0 изключение
# XA0; # XA0; # XA0; Thread.FFatalException: = AcquireExceptionObject;
# XA0; # XA0; край;
# XA0; накрая
# XA0; # XA0; FreeThread: = Thread.FFreeOnTerminate;
# XA0; # XA0; Резултат: = Thread.FReturnValue;
# XA0; # XA0; Thread.DoTerminate;
# XA0; # XA0; Thread.FFinished: = True;
# XA0; # XA0; SignalSyncEvent;
# XA0; # XA0; ако FreeThread тогава Thread.Free;
# XA0; тъй FreeOnTerminate = фалшива (Ehesute не нарича), на # XA0;
# XA0; Thread.Free не нарича
# XA0; # XA0; EndThread (Резултат);
# XA0; # XA0; // директно обаждане pthread_exit тъй EndThread ще отделят нишката причинявайки
# XA0; # XA0; // на pthread_join в TThread.WaitFor да се провали. # XA0; Също така, уверете се, че EndThreadProc
# XA0; # XA0; // се нарича също като EndThread би направил. EndThreadProc не трябва да се върне
# XA0; # XA0; // и призив pthread_exit себе си.
# XA0; # XA0; ако целеви (EndThreadProc) след това
# XA0; # XA0; # XA0; EndThreadProc (Резултат);
# XA0; # XA0; pthread_exit (Pointer (Резултат));
# XA0; край;
приключи;
Но аз отидох и сценограф на извикването на нишка най-нисък приоритет - и в една линия, ако не Thread.Terminated тогава не Thread.Terminated състояние лесно може да бъде вярно.
> Или ustoanovi да True да прекрати.
Възможно е и това изпълнение. Аз се върне у дома - potestit.
Можете тества кода [0]? Не? Но аз тествани. С FastMM4. Това мениджър няма да излъже.
И без FastMM4 да видите, че всеки път, когато натиснете Button1 "sodaetsya" един дескриптора.
Говориш за вградената в Делфи дебъгер чух # XA0;?
При отстраняване на грешки (D7) и минах кода в [18] и е установено, причината за изтичане на информация - в грешни котки за готвене.
Да. Признавам, моя грешка :(
Ние просто трябва да ферма цялата линия FreeOnTerminate: = True; бутна в изпълнява, и тук аз помислих, че е прав. Но не. Кофти!
Свързани статии