ПредишенСледващото

теч памет с конци


# 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; бутна в изпълнява, и тук аз помислих, че е прав. Но не. Кофти!

Свързани статии

Подкрепете проекта - споделете линка, благодаря!