2

私は次のことを達成しようとしています(Delphi7を使用):プログラムにログインした後、ユーザーは制御を取得しますが、バックグラウンドで別のスレッドがインターネットからファイルをダウンロードして、現在のライセンスキーがブラックリストに登録されているかどうかを確認します. そうである場合、ユーザーはプロンプトを受け取り、プログラムは終了します。

そこで、InternetOpenURL/InternetReadFile を使用してネットからブラックリストをダウンロードする別の TThread クラスを作成しました。

私の問題は次のとおりです。

バックグラウンドでのダウンロードが完了する前にユーザーがプログラムを終了した場合、ライセンス マネージャー スレッドはメイン スレッドによって終了される必要があります。

スレッドがジョブを完了した場合、スレッドは自動的に終了するはずです。

FreeOnTerminate := true を使用すると、メイン スレッドからスレッドを終了できません。しかし、それ以外の場合、スレッドがジョブを完了した後にリソースを解放するにはどうすればよいでしょうか?

私の他の質問は次のとおりです。

ライセンス キーがブラックリストに登録されている場合は、Synchronize を使用して、アプリケーションのメイン フォームの特定のリソースを処理します。

しかし、たとえば、ユーザーが既にアプリを閉じていて、プログラムがメイン フォームの FormDestroy にあるかどうかを知るにはどうすればよいでしょうか? 同期するタイミングを間違えると、アクセス違反が発生する可能性があります...

ありがとう!

4

3 に答える 3

1

まず、チェック スレッド オブジェクトで、「完了」フラグを作成します。これが真であることを確認して、すべてが正常かどうかを判断できます。Chris T が示唆するように、スレッドにグローバルを設定して、物事が良いか悪いかを示すようにします。これにより、メイン スレッドはタイマーのようなものを使用してそれをチェックし、すべてがうまくいっているか、適切なアクションを実行できるようになります。

次に、アプリを早期に終了したい場合は、

  MyThread.Terminate;
  MyThread.WaitFor;

そして、スレッドで、適切なポイントで Terminated が設定されていることを確認します。こうすれば綺麗に閉じることができます。

于 2010-08-13T13:30:41.307 に答える
0

2 番目の質問については、わざわざスレッドから 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

これがあなたがやろうとしていることだと思います.... TThread に OnTerminate() イベントを割り当てます。これは、ワーカー スレッドが終了したときにメイン スレッドの一部として実行されます。ここですべての UI 更新を行うことができます (ブラック リスト)。「DownloadComplete」などのワーカー スレッドのプロパティを作成し、OnTerminated イベントで true に設定されている場合にのみ、ブラックリストへの登録/検証を行います。これにより、プログラムが終了する前に .watifor() を実行している限り、プログラムの実行時のダウンロードの状態に関係なく、スレッドが自分自身を解放できるはずです。

于 2010-08-13T20:40:07.503 に答える