Что такое TExternalThread? “Не может завершить внешне созданный поток” при завершении основанного на потоке таймера

Это происходит половина времени при закрытии моего приложения, в котором я разместил TLMDHiTimer в свою форму во время проектирования, Включенное набор к истинному. В моем событии OnFormClose я называю MyLMDHiTimer. Включенный: = ложь. Когда это называют, я иногда (приблизительно половина времени) получаю это исключение.

Я отладил и ступил в вызов и нашел, что это - строка 246 в LMDTimer.pas, который дает эту ошибку.

FThread.Terminate;

Я использую последнюю версию LMDTools. Я сделал полное, переустанавливают инструментов LMD перед выходными и удалили и повторно добавили компонент к форме правильно также.

Из того, что я нашел, это имеет некоторое отношение к TExternalThread, но нет никакой документации относительно него от Причала, и я не нашел ничего ссылающегося на него в исходном коде LMDTools.

Используя полностью обновленный Studio RAD 2010, Delphi 2010.

Что действительно расстраивает меня, вот то, что нет никакой документации вообще. Google приводит к одному результату, который на самом деле говорит об этом, в котором кто-то говорит, что ошибка вызывается путем попытки завершить TExternalThread. Но смотря на исходный код для этого LMDHiTimer, не однажды делает он имеет целью делать, почти создают регулярный TThread. Тот гуглит результат, который я мог найти, Поток: не Может завершить внешне созданный поток? на Причале упоминает, что использовал GetCurrentThread () и GetCurrentThreadId (), чтобы заставить данные, необходимые зацепляться к существующему потоку, но TLMDHiTimer не делает такой вещи. Это просто создает своего собственного потомка TThread с его собственным, Создают () конструктора (переопределенный, конечно, и вызовы, наследованные в начале конструктора)

Так... Какого черта этот TExternalThread? Кто-либо еще столкнулся с этим видом исключения? И возможно вычисленный решение или обходное решение? Я задал почти тот же самый вопрос собственной поддержке LMDTOOL, но не может повредить спрашивать в нескольких местах.

Заранее спасибо за любую помощь.

12
задан matthias krull 28 November 2012 в 23:07
поделиться

1 ответ

Выберите элемент на вкладке HTML непосредственно в источнике.

Затем можно наведите курсор на страницу, чтобы переключить ее.

-121--4013005-

Для ОС Linux можно выбрать книгу драйверов устройств O'Reilly Linux или прочитать PDF-файлы в Интернете. На мой взгляд, это один из лучших текстов вокруг на эту тему.

Руководство по программированию модуля ядра Linux является еще одним хорошим ресурсом.

Вы также можете выбрать книгу специально для ядра Linux. Я взял копию Linux Kernel Development (2-е издание) Роберта Лав для этой цели ( 3-е издание на путь).

-121--954595-

TExternalThread заворачивает поток, который не был создан RTL Delphi. Он может представлять поток, принадлежащий пулу потоков ОС, или поток, созданный другой библиотекой DLL в программе. Поскольку поток выполняет код, не принадлежащий связанному классу TExternalThread, метод Terminate не имеет пути уведомлять поток о необходимости его остановки.

Объект Delphi TThread установит для своего свойства Terminated значение True, и метод Execute, который был переопределен, будет периодически проверять это свойство, но поскольку этот поток не является кодом Delphi, метод Execute не существует, и любое свойство Terminated появилось только после того, как код потока уже был записан в другом месте (не путем переопределения ExEcecute)

Поток новостей подсказывает, что, вероятно, происходит в вашем случае:

... повреждена память, что приводит к тому, что член TThread.FExternalThread становится ненулевым значением.

Возможно, это ошибка в библиотеке компонентов или ошибка в собственном коде. Для поиска можно использовать точки останова отладчика . Задайте точку останова в конструкторе потока таймера. Когда программа приостанавливается, используйте команду «Add Breakpoint» в меню Run, чтобы добавить точку останова данных, используя адрес поля FExternalThread нового объекта. После этого, если значение этого поля изменится, отладчик приостановит работу и покажет, что его изменило. (Точка останова данных будет сбрасываться при каждом запуске программы, поскольку среда IDE предполагает, что объект не будет выделяться по одному и тому же адресу каждый раз.)

12
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: