Я пытаюсь добиться следующего (используя Delphi7): после входа в мою программу пользователь получает контроль, но в фоновом режиме отдельный поток загружает файл из Интернета, чтобы проверить, не занесен ли текущий лицензионный ключ в черный список. Если это так, пользователь получает приглашение, и программа завершает работу.
Поэтому я создал отдельный класс TThread, который загружает черный список из Сети, используя InternetOpenURL/InternetReadFile.
Моя проблема заключается в следующем:
Если пользователь закроет мою программу до завершения загрузки в фоновом режиме, поток менеджера лицензий должен быть завершен основным потоком.
Если поток выполнил свою работу, он должен завершиться автоматически.
Если я использую FreeOnTerminate := true, я не могу завершить поток из основного потока. Но иначе, как я могу освободить поток после того, как он выполнил свою работу?
Еще один вопрос:
Если лицензионный ключ занесен в черный список, я использую Synchronize, чтобы сделать что-то с определенными ресурсами основной формы Приложения.
Но как узнать, что пользователь уже закрыл приложение и программа находится в FormDestroy главной формы, например? Если я синхронизирую в неподходящее время, это может привести к нарушению прав доступа...
Спасибо!
WaitFor
илиTerminate
при особых условиях), тоFreeOnTerminate
не подходит для этой работы. FreeOnTerminate — это ярлык, который вы используете для выстрелил-забыл. Вы можете создатьTSimpleEvent
, чтобы отслеживать, когда/если поток действительно уничтожен, и позволить вашему приложениюWaitFor
сделать это. Но тогда вы могли бы просто уничтожить тему самостоятельно с помощью:Thread.Terminate; Thread.WaitFor(<timeout>); Thread.Free;
. - person Disillusioned   schedule 24.10.2014