Как прекращать долго выполнять потоки корректно?

Я решил проблему, не вызывая вручную receiveChanges, которого не было в моем исходном сообщении:

answerChosenFinished(event: AnimationEvent) {
    this.iconAnimationState = IDLE_ANIM_STATE;
    this.changeDetector.detectChanges(); // removed this
}
5
задан delphist 31 October 2008 в 23:51
поделиться

4 ответа

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

Так как Вы не можете изменить код, Вы не можете сделать этого; Вы любой должен жить с фоновой работой (но можно разъединить ее с любым UI, так, чтобы его завершение было проигнорировано); или альтернативно, можно попытаться завершить его (TerminateThread API грубо завершит любой поток, учитывая свой дескриптор). Завершение не является чистым, тем не менее, как Rob, говорит, от любых блокировок, сохраненных потоком, откажутся, и любое перекрестное состояние потока, защищенное такими блокировками, может быть в поврежденном состоянии.

Можно ли рассмотреть вызывание функции в отдельном исполняемом файле? Возможно, с помощью RPC (каналы, TCP, а не общая память вследствие той же проблемы блокировки), так, чтобы можно было завершить процесс вместо того, чтобы завершить поток? Изоляция процесса даст Вам намного больше защиты. Пока Вы не полагаетесь на межпроцессные именованные вещи как взаимные исключения, это должно быть намного более безопасно, чем уничтожение потока.

9
ответ дан 18 December 2019 в 12:03
поделиться

Потоки должны сотрудничать для достижения корректного завершения работы. Я не уверен, предлагает ли Delphi механизм для прерывания другого потока, но такие механизмы доступны в.NET и Java, но должны быть рассмотрены, возможность последней инстанции, и состояние приложения неопределенна после того, как они использовались.

Если можно уничтожить поток в произвольной точке, то можно уничтожить его, в то время как это содержит блокировку в средстве выделения памяти (например). Это оставит Вашу программу открытой для зависания, когда Ваш основной поток затем должен будет получить доступ к той блокировке.

3
ответ дан 18 December 2019 в 12:03
поделиться

Если Вы не можете изменить код для проверки на завершение, то просто установленный его приоритет действительно низко, и игнорирует его, когда это возвращается.

3
ответ дан 18 December 2019 в 12:03
поделиться

Я записал это в ответ на подобный вопрос:

Я использую основанную на исключении технику, это работало вполне прилично на меня во многих приложениях Win32.

Для завершения потока я использую QueueUserAPC для организации очередей вызова к функции, которая выдает исключение. Однако исключение, это брошено, не получено из типа "Исключение", так будет только пойман процедурой обертки моего потока.

Я использовал это с Разработчиком C++ приложения очень успешно. Я не знаю обо всей тонкости Delphi по сравнению с обработкой исключения C++, но я ожидал бы, что это могло легко быть изменено для работы.

0
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

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