Меню Закрыть

Cannot terminate an externally created thread

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

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

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

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

Использование полностью обновленного RAD Studio 2010, Delphi 2010.

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

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

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

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

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

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

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

Возможно, это связано с ошибкой в ​​библиотеке компонентов, или это может быть связано с ошибкой в ​​вашем собственном коде. Вы можете использовать контрольные точки данных отладчика, чтобы попытаться выяснить это. Установите точку останова в конструкторе потока таймера. Когда ваша программа приостанавливается, используйте команду "Добавить точку останова" в меню "Выполнить", чтобы добавить точку останова данных, используя адрес нового поля FExternalThread объекта. После этого, если это значение поля изменится, отладчик остановится и покажет вам, что изменило его. (Контрольная точка данных будет получать reset каждый раз, когда вы запускаете программу, потому что IDE предполагает, что объект не будет распределяться по одному и тому же адресу каждый раз.)

Читайте также:  Портится ли зрение от планшета

Есть ли вероятность, что код может попытаться завершить уже разрушенный TThread? Это может легко произойти, если у вас установлен FreeOnTerminate.

Я заметил ваш пост при диагностике аналогичной (противоположной?) ошибки, "Не могу вызвать" Начать в запущенном или приостановленном потоке "в конструкторе компонента, помещенного в основную форму. Когда я удалил Start(), эта ошибка была заменена более значительными ошибками, например." неправильная операция указателя "и" нарушение доступа "в соответствующем деструкторе. Компонент пытался манипулировать своим TThread-объектом после того, как TThread был Freed, тем самым оставив все в соответствии с законом Мерфи. Когда я исправил это, я смог заменить вызов Start(), не возвращая ошибку" Can not call Start".

По аналогии, может ли ваша проблема быть в том, что адрес вашего FExternalThread был переработан и сбит до вызова деструктора/завершения? В нашем случае у нас была некорректная реализация Singleton Instance Pattern; но опять же, FreeOnTerminate также кажется вероятным подозреваемым.

[FYI: Я использую Я использую С++ под RAD Studio XE]

This happens half of the time when closing my application in which I have placed a TLMDHiTimer on my form in design time, Enabled set to true. In my OnFormClose event, I call MyLMDHiTimer.Enabled := false. When this is called, I sometimes (about half of the time) get this exception.

I debugged and stepped into the call and found that it is line 246 in LMDTimer.pas that gives this error.

I am using the latest version of LMDTools. I did a complete reinstall of LMD tools before the weekend and have removed and re-added the component to the form properly as well.

From what I’ve found, this has something to do with TExternalThread, but there’s no documentation on it from Embarcadero and I haven’t found anything referencing it within the LMDTools source code.

Читайте также:  1Cv77 dat что это

Using fully updated RAD Studio 2010, Delphi 2010.

What really upsets me here is that there’s no documentation whatsoever. Google yeilds one result that actually talks about it, in which someone says that the error is caused by trying to terminate a TExternalThread. But looking at the source-code for this LMDHiTimer, not once does it aim to do anything but create a regular TThread. The one google result I could find, Thread: Cannot terminate an externally created thread? on Embarcadero mentions using GetCurrentThread() and GetCurrentThreadId() to get the data necessary to hook on to an existing thread, but the TLMDHiTimer does no such thing. It just creates its own TThread descendant with its own Create() constructor (overridden of course, and calls inherited at the start of the constructor)

So. What the heck is this TExternalThread? Has anyone else run into this kind of exception? And perhaps figured out a solution or workaround? I’ve asked almost the exact same question to LMDTools’ own support, but it can’t hurt to ask in multiple places.

В наше время слова «Майнинг», «Блокчейн», «Биткоины» раздаются буквально отовсюду: от пассажиров трамвая до серьёзных бизнесменов и депутатов Госдумы. Разобраться во всех тонкостях и подводных камнях этих и смежных понятий сложно, однако в базе данных на нашем сайте Вы быстро найдёте исчерпывающую информацию, касающуюся всех аспектов.

Ищем дополнительную информацию в базах данных:

Cannot terminate an externally created thread

Дождитесь окончания поиска во всех базах.
По завершению появится ссылка для доступа к найденным материалам.

Перейти к результатам поиска >>>

Вкратце же все необходимые знания будут изложены в этой статье.
Итак, начать стоит с блокчейна. Суть его в том, что компьютеры объединяются в единую сеть через совокупность блоков, содержащую автоматически зашифрованную информацию, попавшую туда. Вместе эти блоки образуют базу данных. Допустим, Вы хотите продать дом. Оформив документы, необходимо идти к нотариусу, затем в присутствии его, заверив передачу своей подписью, Вам отдадут деньги. Это долго, да и к тому же нужно платить пошлину.

Благодаря технологии блокчейна достаточно:

  1. Договориться.
  2. Узнать счёт получателя.
  3. Перевести деньги на счёт получателя.

. и не только деньги. Можно оформить электронную подпись и отправлять документы, любую другую информацию, в том числе и конфиденциальную. Опять же, не нужны нотариусы и другие чиновники: достаточно идентифицироваться Вам и получателю (будь то частное лицо или госучреждение) в своём компьютере.

Читайте также:  Intel core i5 3570 ivy bridge

Возможность взломать исключена из-за огромного количества блоков, описанных выше. Для хакера нужно подобрать шифр для каждого блока, что физически нереально.

Другие возможности использования блокчейна:

  • Страхование;
  • Логистика;
  • Оплата штрафов
  • Регистрация браков и многое другое.


С блокчейном тесно связано понятие криптовалюта. Криптовалюта — это новое поколение децентрализованной цифровой валюты, созданной и работающей только в сети интернет. Никто не контролирует ее, эмиссия валюты происходит посредством работы миллионов компьютеров по всему миру, используя программу для вычисления математических алгоритмов.

Вкратце это выглядит так:
1. Вы намереваетесь перевести кому-то деньги.
2. Генерируется математический код, проходящий через уже известные Вам блоки.

3. Множество компьютеров (часто представляющих собой совокупность их, с мощными процессорами и как следствие большей пропускной способностью) обрабатывают цифровую информацию, передавая их на следующие блоки, получая за это вознаграждение (некоторые транзакции можно совершать бесплатно)
4. Математический код доходит до электронного кошелька получателя, на его балансе появляются деньги.

Опять же, как это в случае с блокчейном, переводы криптовалют никем не контролируются.

Работающих по подобному принципу валют много. Самой знаменитой является, конечно, биткоин. Также популярны эфириум, ритл, лайткоины, нумитсы, неймкоины и многие другие. Разница у них в разном типе шифрования, обработки и некоторых других параметрах.

Это люди, создавшие упомянутую выше совокупность компьютерных видеокарт, которая генерирует новые блоки, передающие цифровую информацию — биткоины (или ритлы, или любую другую криптовалюту). За это они получают вознаграждение в виде той же самой криптовалюты.

Существует конкуренция между майнерами, т.к. технология с каждой транзакции запрограммировано усложняется. Сначала можно было майнить с одного компьютера (2008 год), сейчас же такую валюту как биткоин физическим лицам уже просто невыгодно: нужно очень много видеокарт (их все вместе называют фермами), с огромными вычислительными мощностями. Для этого снимаются отдельные помещения, затраты электроэнергии для работы сравнимы с затратами промышленных предприятий.

Зато можно заработать на других, менее популярных, но развивающихся криптовалютах. Также различают соло майнинг и пул майнинг. Соло — это создание своей собственной фермы, прибыль забирается себе. Пул же объединяет других людей с такими же целями. Заработать можно гораздо больше, но придётся уже делиться со всеми.

В Японии криптовалюта узаконена. В России в следующем году собираются принять нормативно-правовые акты о легализации блокчейна, переводов криптовалюты и майнинга. Планируется перевод некоторых операций в рамки блокчейна. Имеет смысл изучить это подробнее, и, при желании, начать зарабатывать. Очевидно, что сейчас информационные технологии будут развиваться и входить в нашу жизнь всё больше и больше.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.