2012-02-10 4 views
1

Есть ли какой-либо аналог для Delphi, который указывает, что какой-то поток является фоновым потоком? Что касается .NET, я могу сказать SomeThread.IsBackground = true;, и этот поток станет фоном. Спасибо заранее!Фоновые потоки в delphi

+3

В Delphi каждая нить, кроме основной нити, является фоновой нитью. Вот почему вы можете обновлять графический интерфейс только из основного потока. – jpfollenius

+0

В Windows нет ничего похожего на «фоновый поток». Вы можете указать приоритет потока (SetThreadPriority), чтобы иметь некоторый поток, предварительно упущенный более критичными, когда это необходимо (т. Е. Поток, который генерирует и печатает отчет, может иметь более низкий приоритет, чем основной поток, который обрабатывает ввод пользователя). Похоже, что реализация .NET реализовала упрощенный подход и просто «убивает» «фоновый» поток, когда программа выходит (она работает из-за GC), IMHO - это опасный подход, потоки должны выходить чисто, когда это возможно. См. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms685100(v=vs.85).aspx –

+0

Если программа завершает работу, потоки должны выйти чисто, когда это абсолютно необходимо, чтобы они делали это , например. чтобы файлы, открытые для записи, были очищены. Если нет явной причины для обеспечения чистого выхода, зачем беспокоиться? –

ответ

8

документация .net описывает IsBackground свойства как это:

Нити либо фоновый поток или передний план нить. Фоновые потоки идентичны потокам переднего плана, за исключением того, что фоновые потоки не препятствуют завершению процесса. Как только все потоки переднего плана, принадлежащие процессу, завершатся, общая среда выполнения языка завершает процесс. Любые оставшиеся фоновые потоки останавливаются и не завершаются.

Процесс Delphi завершается, когда основная функция в файле .dpr завершается. Эта основная функция всегда выполняется в контексте основного потока процессов, который является потоком, который автоматически создается системой при запуске процесса.

Итак, в Delphi нет эквивалентного имущества. Существует одна нить переднего плана, основной поток и все остальные потоки - фоновый поток, используя терминологию .net. Нить не может во время выполнения изменять состояние с переднего плана на задний план или наоборот.

3

Чтобы убедиться, что текущий поток является основным потоком VCL, проверьте TThread.CurrentThread.ThreadID = MainThreadID (*). Основной поток VCL должен оставаться передним потоком и является единственным потоком, в который должен быть обновлен графический интерфейс, поэтому ответ на ваш вопрос «нет».

Если вы используете последнюю версию Delphi, вы можете использовать TThread.CreateAnonymousThread и TThread.Synchronize, чтобы анонимные методы выполнялись либо в фоновом потоке, либо в основном потоке VCL, соответственно.

*) Обратите внимание, что свойство класса CurrentThread было добавлено только в несколько версий. Если вы используете старую версию Delphi, такую ​​как Borland Delphi 7, вы можете выполнить эту проверку только в рамках метода выполнения потока (или любого метода, который вызывается Execute и т. Д.).

1

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

Смежные вопросы