Jak sprawdzić czy procedura zakończyła działanie przed powtórnym jej wywołaniem.

0

Prawdopodobnie źle nazwałem ten problem, ponieważ nic nie mogę znaleźć w internecie...

Najlepiej aby, po zakończeniu działania włączyła się od nowa. Chodzi mi o zwykły Button1Click.

0

Nic nie musisz robić, na czas działania procedury program zupełnie staje, a kliknięcia myszy są sprawdzane dopiero po jej zakończeniu - jeśli chcesz jednak, żeby w trakcie działania procedury była możliwość uruchomienia drugi raz oraz możliwość robienia innych rzeczy typu przeciąganie okna to w środku niej musisz dodać linijkę: Application.ProcessMessages;

możesz zrobić również coś takiego:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  uruchomiona: Boolean = false;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  if uruchomiona then
    begin
      ShowMessage('To wykonuje sie w trakcie gdy cos sie dzieje');
      Exit;
    end;
  // jesli dodatkow ma czekac aby poprzednia skonczyla, to zamiast tego wyzej:
  // while uruchomiona do
  //   begin
  //     Application.ProcessMessages;
  //     //tutaj mozna cos wyswietlic
  //   end;

  uruchomiona:=true;
  Label1.Caption:='Ktos wcisnal przycisk, wiedz ze cos sie dzieje...';
  // tutaj sztucznie robie procedure ktora czeka ok. 3 sekund (ciut wiecej)
  // po to aby pokazac dzialanie
  for i:=0 to 3000 do
    begin
      Sleep(1);
      //sprobuj zakomentowac ta linie i zobacz co sie stanie
      Application.ProcessMessages;
    end;
  Label1.Caption:='Nic sie nie dzieje';
  uruchomiona:=false;
end;

end.

Wersja do pobrania

0

Nie wiem, czy o to chodziło, ale jeśli procedura jest wywoływana jednocześnie przez wiele wątków i chcemy wywołania uszeregować, to po prostu niech ciało procedury będzie w sekcji krytycznej - wtedy nie będą mogły istnieć dwa wywołania równolegle.

0

Ja zawsze robię to tak.

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
// lub Screen.Cursor := crAppStart;

// wykonanie procedury

Button1.Enabled := True;
// lub Screen.Cursor := crDefault;

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0