Научете за прекратяването на нишки като
Има основна нишка, от която създавам друга. Той се доработва и довършва сам, т.е. 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. Опитах го след водка, но това беше обикновено ежедневие.
Е, къде са "всички" ?
Има факт, че е добавена някаква променлива и къде е фактът на прекратяването на работата на поточната функция ?