Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с 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 подобноеисключение не возникнет НИКОГДА.


Наверх

Титульная страница Поиск, карта сайта Написать письмо