0

私は現在のシナリオを持っています.imは、次のような一般的なバックグラウンド作業にomnithreadlibraryを使用しています:

TMethod = procedure of object;

TThreadExecuter = class;

IPresentationAnimation = interface
  ['{57DB6925-5A8B-4B2B-9CDD-0D45AA645592}']
  procedure IsBusy();
  procedure IsAvaliable();
end;

procedure TThreadExecuter.Execute(AMethod: TMethod); overload;
var ATask : IOmniTaskControl;
begin
  ATask := CreateTask(
    procedure(const ATask : IOmniTask) begin AMethod(); end
  ).OnTerminated(
    procedure begin ATask := nil; end
  ).Unobserved().Run();

  while Assigned(ATask) do
    begin
      Sleep(10);
      Application.ProcessMessages;
    end;
end;

procedure TThreadExecuter.Execute(ASender: TCustomForm; AMethod: TMethod); overload;
var AAnimator : IPresentationAnimation;
begin
  if(Assigned(ASender)) then
    begin
      TInterfaceConsolidation.Implements(ASender, IPresentationAnimation, AAnimator, False);
      if(Assigned(AAnimator)) then AAnimator.IsBusy()
      else ASender.Enabled := False;
    end;
  try
    Self.Execute(AMethod);
  finally
    if(Assigned(ASender)) then
      begin
        if(Assigned(AAnimator)) then AAnimator.IsAvaliable()
        else ASender.Enabled := True;
      end;
  end;
end;

したがって、実行を開始する前に、次のようにインターフェイスをブロックします。

TMyForm = class(TForm, IPresentationAnimation);

procedure TMyForm.LoadData();
begin
  TThreadExecuter.Execute(Self, Self.List);
end;

procedure TMyForm.IsBusy();
begin
  try
    Self.FWorker := TPresentationFormWorker.Create(Self);
    Self.FWorker.Parent := Self;
    Self.FWorker.Show();
  finally
    Self.Enabled := False;
  end;
end;

スレッドが終了したら、次のようにブロックを解放します。

procedure TMyForm.IsAvaliable();
begin
  try
    Self.FWorker.Release();
  finally
    Self.Enabled := True;
  end;
end;

注: TPresentationFormWorker は、ビジー状態のフォームに入れたアニメーション フォームです。

問題は、フォームを無効にした後でもスレッドの実行が「ビジー」な場合でも、フォームとやり取りできることです。次に例を示します。

  • 私は任意のボタンをクリックすることができ、スレッドが実行を終了すると、ボタンのアクションがトリガーされます。
  • 私は任意のコントロールに入力できます。たとえば、意味のない情報を編集し、スレッドが実行を終了すると、コントロールに提供したコンテンツは以前に消去されます (ui ロールバック? 笑)。

私の推測では、スレッドが application.processmessages のおかげで機能している間、フォームを無効にするために行ったやり取りがキューに送信され、スレッドが終了すると、それらはすべてフォームに送り返されます。

私の質問は: フォームを実際に無効にすることは可能ですか?

事前にt​​hx。

4

0 に答える 0