Zatrzymanie procedury

0

Witam
Pisze program, w którym pod jednym przyciskiem mam ciąg poleceń, a następnie nieskończoną pętle (chodzi o to by program wykonywał dane czynności pod moją nieobecność) i tu pojawia się moje pytanie: Czy ktoś zna sposób zatrzymania tej procedury (buttonclick) w dowolnym momencie poprzez naciśnięcie danego klawisza (np. spacji) ??

Szukam w googlach już od minimum godziny i nic rozsądnego nie mogę znaleźć :(

0
Exit
Break
0

Patryk27, autorowi chyba nie do końca o to chodziło.

Moja propozycja jest taka:

var
  Koniec: Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Koniec:= false;
  repeat
    // Tu Twoje instrukcje
    Label1.Caption:= IntToStr(GetTickCount mod 1000); // Sprawdzian, czy działa
    Application.ProcessMessages;                      // Konieczne!
  until Koniec;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Koniec:= true;
end;
0

Ja w swoim programie obsłużyłem globalnie klawdeskę i mysię.
Ogólnie sprawdza czas bezczynności mojej na kompie.
Oto funkcja:

//czas bzczynności
function LastInput: String;
var
     LInput: TLastInputInfo;
     T:array[1..3] of Byte;
     S:array[1..3] of String;
     I:Integer;
begin
     LInput.cbSize := SizeOf(TLastInputInfo);
       GetLastInputInfo(LInput);
         I := (GetTickCount - LInput.dwTime) div 1000;
             T[1]:=I div 3600; //Godziny
         I:=I-(T[1]*3600);
             T[2]:=I div 60; //Minuty
         I:=I-(T[2]*60);
             T[3]:=I;
        S[1]:=inttostr(T[1]);S[2]:=inttostr(T[2]);S[3]:=inttostr(T[3]);
      If T[1]<10 then S[1]:='0'+S[1];
    If T[2]<10 then S[2]:='0'+S[2];
  If T[3]<10 then S[3]:='0'+S[3];
 Result:=S[1]+':'+S[2]+':'+S[3];
end;
0

Simplex twój pomysł jest bardzo fajny :), tylko że nie dodałem, że mój program wykonuje czynności typu ustawianie kursora w danym miejscu, klikanie itp. więc po naciśnięciu startu nie mam dostępu do głównej formatki (a nawet gdybym miał to nie mógł bym na niej nacisnąć przycisku stopującego gdyż formatka jest przyblokowana przez cały proces wykonywanych czynności), (twój pomysł sprawdziłem na pętli dodającej w nieskończoność), a więc pozostaje tylko rozwiązanie w stylu naciśnięcia jakiegoś klawisza na klawiaturze i w powiązaniu z twoim pomysłem można by było (aczkolwiek nie wiem czy się da i czy by działało -> jestem mało doświadczony) przypisać rozpoczęcie procedury buttonclick jakiemuś klawiszowi z klawiatury. Masz na to jakiś pomysł?

0

Zainteresuj się takimi zagadnieniami jak globalny hook na klawiaturę
albo funkcja RegisterHotKey (ta druga - to bardziej tylko dla aplikacji
typowo okienkowych) i użyj wcisnięcia jakiegoś, ustalonego klawisza,
do zatrzymania kodu. Więcej info bez problemu znajdziesz w google.

0

Witam ponownie temat się trochę urwał :) doszedłem do wniosku, że nie potrafię zrobić tego w znany mi sposób :( ale wydaje mi się, że można by ten problem rozwiązać za pomocą wątku, który by działał podczas całej pracy programu (razem z nim by się otwierał i zamykał) i miałby za zadanie tylko z czytanie klawisza w dowolnym momencie a następnie zamknięcie formy. Osobiście nie znam się na tych wątkach więc nie wiele mogę powiedzieć. Do tych co wiedzą co nieco na ten temat: Myślicie, że jest to możliwe?

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure press(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1; koniec:Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Koniec:= false;
    repeat
        SetCursorPos(590, 1060);
        sleep(10000);
        SetCursorPos(100, 200);
        sleep(10000);
        Application.ProcessMessages;
    until Koniec=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var h:integer;
begin
h:=0 ;
if koniec=true then h:=1;
label2.Caption:=inttostr(h);
end;

procedure TForm1.press(Sender: TObject; var Key: Char);
begin
if key=#13 then Koniec:= true;//enter
Key:= #0;
end;

end. 

To program na którym tylko ćwiczyłem ale zachowuje się tak samo jak ten co pisze

0

Myślę, że jest to możliwe i skoro chcesz to zrob to w wątku, bo jak wynika z
kodu poniżej nadal tego w wątku nie robisz. Bo nie ma się co tak co chwile o
wszystko pytać, tylko wziąć zakodować co trzeba. Wiadomo więcej informacji
znajdziesz - pod adresem: http://4programmers.net/Delphi/Artykuły/Wątki
a co do przerywania pracy wątku, jeżeli aplikacja ma w nim symulować "kliki"
myszką to wykorzystać to co powyżej napisałem, czyli hook/globalny HotKey.

0

Dzięki za rady i adres, aczkolwiek już wcześniej przeczytałem ten artykuł i nie tylko ten i chyba jestem za cienki na te wątki, nie za bardzo rozumiem i próbowałem coś napisać ale już od samego początku mi błędy wywalało, więc pÓÓÓÓki co skupie się na tych globalnych hookach :)
Pozdrawiam

0

PÓki co to skup się też raczej na dokładniej lekturze słownika
ortograficznego przed napisaniem czkogolwiek - gdziekolwiek w
Internecie. Napisz konkretny kod i jakie błędy masz z wątkami.

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