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