2

我正在尝试实现以下目标(使用Delphi7):登录到我的程序后,用户获得控制权,但在后台一个单独的线程从互联网下载文件以检查当前许可证密钥是否被列入黑名单。如果是,用户会收到提示并且程序终止。

所以我创建了一个单独的 TThread 类,它使用 InternetOpenURL/InternetReadFile 从网络下载黑名单。

我的问题如下:

如果用户在后台下载完成之前退出我的程序,则许可证管理器线程应由主线程终止。

如果线程完成了它的工作,它应该自动终止。

如果我使用 FreeOnTerminate := true 我不能从主线程终止线程。但除此之外,我怎样才能让线程在完成其工作后释放其资源?

我的另一个问题是:

如果许可证密钥被列入黑名单,我会使用 Synchronize 对应用程序主窗体的某些资源进行处理。

但是我怎么知道用户是否已经关闭了应用程序并且程序是否在主窗体的 FormDestroy 中?如果我在错误的时间同步,可能会导致访问冲突......

谢谢!

4

3 回答 3

1

首先,在您的检查线程对象中,创建一个“已完成”标志。您可以检查这是否属实,以确定是否一切正常。正如 Chris T 建议的那样,让线程设置一个全局变量来指示事情的好坏,以便主线程可以使用计时器之类的东西来检查一切是否正常或采取适当的措施。

然后,如果您的应用想提前退出,请致电

  MyThread.Terminate;
  MyThread.WaitFor;

在线程中,检查是否在适当的点设置了 Terminated。这样你就可以很好地关闭。

于 2010-08-13T13:30:41.307 回答
0

对于第二个问题,不要费心从线程更新 UI。只需设置一个全局标志。即 IsBlackListed := true; 现在,您可以使用该全局标志作为唠叨用户的基础,以响应某些用户发起的操作。例如 OnFileSave... ShowMessage('我很乐意为您保存该文件,但不幸的是,您使用的是列入黑名单的密钥。');

IsBlackListed Redux....

// globally...
var
  IsBlackListed  : integer;

...
initialization
  IsBlackListed  := 0;

...
// in your thread:
if OhMyGodThisIsABlackListedKey then
  IsBlackListed := 1;

... Back in the main code, maybe in the OnSaveMyData event:

if IsBlackListed then
begin
  IsBlackListed := -1; // so we don't repeat ourselves
  MessageBox('Hey, you naughty pirate!');
  MyDBConnection.Whatever.DoSQL('insert into licensetable (name,key) values(pirate,blacklisted);
end;
于 2010-08-13T12:52:15.507 回答
-1

我认为这就是你想要做的......将 OnTerminate() 事件分配给 TThread,当工作线程终止时,它会作为主线程的一部分被执行。您可以在那里进行所有 UI 更新(黑名单)。为您的工作线程创建一个属性,例如“DownloadComplete”,并且仅在 OnTerminated 事件中设置为 true 时才进行黑名单/验证。这应该允许线程在程序运行时释放自己,而不管程序运行时的下载状态,只要您在程序退出之前 .watifor() 它。

于 2010-08-13T20:40:07.503 回答