Я пытаюсь добиться следующего (используя Delphi7): После входа в мою программу пользователь получает контроль, но в фоновом режиме отдельный поток загружает файл из Интернета, чтобы проверить, включен ли текущий лицензионный ключ. Если это так, пользователь получает приглашение, и программа завершается.Некоторая помощь с TThread (Terminate, FreeOnTerminate и другими приключениями в области потоковой передачи)
Итак, я создал отдельный класс TThread, который загружает черный список из сети с помощью InternetOpenURL/InternetReadFile.
Моя проблема заключается в следующем:
Если пользователь завершает работу своей программы до загрузки в фоновом режиме заканчивается лицензия менеджер Нить должна быть прекращена в основном потоке.
Если поток выполнил свою работу, он должен автоматически прекратиться.
Если я использую FreeOnTerminate: = true, я не могу завершить поток из основного потока. Но в остальном, как я могу сделать поток свободным от его ресурсов после того, как он выполнил свою работу?
Мой другой вопрос:
Если лицензионный ключ занесен в черный список, я использую Синхронизировать, чтобы сделать что-то с определенными ресурсами главной формы приложения.
Но как узнать, если пользователь уже закрыл приложение, а программа находится в FormDestroy основной формы, например? Если я синхронизируюсь в неподходящее время, это может привести к нарушениям доступа ...
Спасибо!
Просто любопытно ... почему вы это делаете, а не просто передаете лицензионный ключ, скажем, веб-приложение и получаете ответ «да/нет», чтобы проверить ключ? – GrandmasterB
Я делаю это прямо сейчас. Я вызываю php-скрипт с лицензионным ключом в качестве параметра, и если он занесен в черный список, он возвращает строку BLACKLISTED и причину черного списка (клиент не платил счет и т. Д.) Я также использую тот же скрипт/часть программы для выпуска обновлений лицензий (пользователь обновляет подписку на программное обеспечение) – Steve
Проще говоря, если вы хотите каким-либо образом взаимодействовать с потоком (это включает 'WaitFor' или' Terminate' в особых условиях), тогда 'FreeOnTerminate' не является правильным инструментом для работы. FreeOnTerminate - это ярлык, который вы используете для *** fire-and-forget ***. Вы можете создать 'TSimpleEvent' для отслеживания, когда/если поток фактически уничтожен и пусть ваше приложение' WaitFor'. Но тогда вы могли бы просто уничтожить поток самостоятельно: «Thread.Terminate; Thread.WaitFor (); Thread.Free; '. –