Научете за прекратяването на нишки като

Има основна нишка, от която създавам друга. Той се доработва и довършва сам, т.е. FreeOnTerminate = true. Не е нужно да го довършвам. Как да разбера от основната нишка дали създадената завърши изпълнение със стандартни средства? В момента има променлива, която е зададена на true в потока за създаване, в края на Execute или OnTerminate е зададена на false. Мислех, че ако се прекрати и трябва да бъде унищожен сам, опитайте се да проверите за нула - не е бил там, дескрипторът не е изчистен. Как може да се направи това не чрез добавяне на променливи, а коя нишка чрез проверка на стандартно свойство, да речем или нещо подобно

Изпратете съобщение до основната нишка при завършване?

> Изработва се и се довършва, т.е. FreeOnTerminate = true

Вземете FreeOnTerminate = true.

В основната нишка се обадете

MyThread.WaitFor;
. тук допълнителният поток е ГАРАНТИРАН, за да завърши изпълнението му .
MyThread.Free; // и тук той престана да съществува

по-лесно е да се премахне самият поток. и не е нужно да чакате.

Трябва ми и основната нишка да работи, а не да се забавя, с WaitFor той спи. Тези. отново само със символи или съобщения? Няма друг начин?


> Трябва и основната нишка да работи

Можете да направите това - веднага щом основният поток няма да направи нищо и спре да „пуши“, ще се случи събитието Application.OnIdle.
В неговия манипулатор можете свободно да проверите дали допълнителният ви поток около домакинството е закръглен в този момент и ако се е закръглил, тогава го унищожете.

с MyThread правя
опитвам
GetExitCodeThread (.CheckThreadError (GetExitCodeThread (Handle) <> 0);
// допълнителната нишка е гарантирано закръглена - тук можете да вземете резултатите от работата от нея
// преди да го унищожа
Безплатно; // унищожаване на допълнителна нишка
с изключение
на EThread направете; // допълнителната нишка е все още жива и работи
друго
рейз; // случи се нещо друго, например сте забравили или не сте искали да премахнете реда FreeOnTerminate: = Вярно - вземете куп рейкове
край;

с MyThread правя
опитвам
CheckThreadError (GetExitCodeThread (Handle) <> 0);

Е, за да проверите дали е жив или не, просто кажете GetThreadContext (или варианти на OpenThread и т.н.)


> просто кажете GetThreadContext (или вариации

Какво по дяволите? Ако лично получената дръжка за конец е точно пред носа ви ?

Не разбирам нещо, предполагам. Решението е най-стандартното и лежи на повърхността - така смокинята е извратена?

FThread: = TMyThread.Create (Вярно); // FThread - поле на формуляр.
FThread.FreeOnTerminate: = Вярно;
FThread.OnTerminate: = ThreadTerminate; // Метод ThreadTerminate - форма
FThread.Resume;

процедура TForm1.ThreadTerminate (Изпращач: TObject);
започнете
FThread: = нула
край;

Сега можете да проверите полето FThread навсякъде - ако не е нула, тогава нишката все още работи. И всички случаи.

Под стандартни средства имам предвид нещо вече внедрено, а не нещо, което тепърва трябва да бъде приложено:)

Е, имам основателна причина - отстранявам грешки в собствения си написан дебъгер:) След шампанско това е много забавно изживяване:)


> След шампанско това е много забавно изживяване:
>)

Никога не опитвах.
До следващия път отново
355 дни:(

P.S. Опитах го след водка, но това беше обикновено ежедневие.

Е, къде са "всички" ?
Има факт, че е добавена някаква променлива и къде е фактът на прекратяването на работата на поточната функция ?