![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с TThread
Helen © (2005-08-17 14:26:00)Добрый день. Подскажите что не так делаю. В приложении создается поток, обращается к компоненту Memo через Synchronize. когда я пытаюся прервать поток (Terminate), выдается ошибка:
Code 6: Неверный дискриптор
Digitman (2005-08-17 15:23:00) [1]
> Helen (17.08.05 15:19) [16]
> FreeOnTerminate было True
надо понимать, True было присвоено этому св-ву от балды ?
или были осознанные мотивы ?
Helen (2005-08-17 15:19:00) [2]Спасибо, действительно FreeOnTerminate было True.
Digitman (2005-08-17 15:13:00) [3]
> нужно "Если FreeOnTerminate = True, то..."
тогда становятся необязательными условия в последующих утверждених, а именно
> необходимо дождаться завершения потока (например, используя
> WaitFor) и только после этого вызывать его деструктор
в томи самом "противном случае" (т.е. FreeOnTerminate= False) достаточно вызвать TThread.Free.. конечно же при условии, что состояние уничтожаемого объекта (непосредственно перед его уничтожением) не интересует.
Dimous (2005-08-17 15:08:00) [4]Извиняюсь... конечно же наоборот, в сообщении [10] вместо "Если FreeOnTerminate = False, то..." нужно "Если FreeOnTerminate = True, то..."
Digitman (2005-08-17 15:02:00) [5]
> Dimous © (17.08.05 14:57) [12]
> что не так?
> Если FreeOnTerminate = False, тогда ThreadLoadManual.Free
> лишнее
Если нет АВТО разрушения объекта, то кто должен в этом случае вызвать явный TThread.Free ? Пушкин ?
Dimous (2005-08-17 14:57:00) [6]
> Digitman
А что не так?
Digitman (2005-08-17 14:54:00) [7]
> Dimous © (17.08.05 14:52) [10]
неверно.
Dimous (2005-08-17 14:52:00) [8]Если FreeOnTerminate = False, тогда ThreadLoadManual.Free лишнее. В противном случае необходимо дождаться завершения потока (например, используя WaitFor) и только после этого вызывать его деструктор...
Digitman (2005-08-17 14:48:00) [9]
> Helen (17.08.05 14:35) [4]
> Небылицы или нет - незнаю
а надо бы знать.
> факт остается
факт того, что при выполнении ИМЕЕННО ЭТОЙ строчки
ThreadLoadManual.Terminate
а не какой-либо иной, тобой выдуман.
Leonid Troyanovsky (2005-08-17 14:41:00) [10]
> Helen (17.08.05 14:36) [5]
> Небылицы или нет - незнаю. Но факт остается. Нажимаю Button
> по которой выполняется
> ThreadLoadManual.Terminate;
> ThreadLoadManual.Free;
Free и так делает Terminate.
Однако, интересовал код потока.
Хотя, и сейчас можно сказать, что Syncronize при
обращении к мемо не очень нужен, достаточно Perform.
--
Regards, LVT.
MBo (2005-08-17 14:41:00) [11]FreeOnTerminate как установлено?
Reindeer Moss Eater (2005-08-17 14:39:00) [12]У тебя видимо FreeOnTerminate = True;
И ошибка возникает на ThreadLoadManual.Free;
Helen (2005-08-17 14:36:00) [13]Небылицы или нет - незнаю. Но факт остается. Нажимаю Button по которой выполняется
ThreadLoadManual.Terminate;
ThreadLoadManual.Free;
ThreadLoadManual := nil;
после чего программа думает-думает и выдает вышеописанное исключение.
Helen (2005-08-17 14:35:00) [14]Небылицы или нет - незнаю. Но факт остается. Нажимаю Button по которой выполняется
ThreadLoadManual.Terminate;
ThreadLoadManual.Free;
ThreadLoadManual := nil;
после чего программа думает-думает и выдает вышеописанное исключение.
Reindeer Moss Eater (2005-08-17 14:33:00) [15]>Вообще Terminate надо делать, когда поток остановлен (Suspend)
Никакой разницы нет когда это надо делать.
Anatoly (2005-08-17 14:31:00) [16]А можно взглянуть на код. Вообще Terminate надо делать, когда поток остановлен (Suspend)
Digitman (2005-08-17 14:30:00) [17]
> когда я пытаюся прервать поток (Terminate), выдается ошибка:
> Code 6: Неверный дискриптор
не рассказывай небылицы.
при вызове метода Thread.Terminate подобноеисключение не возникнет НИКОГДА.