Brak możliwości zamknięcia aplikacji z uruchomionym wątkiem

0

Witam, napisałem aplikację która po uruchomieniu ma wykonać kilku skrótów klawiszy, a następnie sama się zamknąć.
Wykonanie skrótów wrzuciłem do wątku, bo w innym wypadku cała aplikacja się przycinała. Teraz wszystko działa jak należy, jednak wykonanie Application.Terminate; nie zamyka aplikacji. Próbowałem również z Application.Free;, wtedy okno aplikacji znika, jednak aplikacja wciąż znajduję się w procesach.

W jaki sposób poprawnie wyłączyć tę aplikację?

0

Zatrzymaj najpierw wątki.

0

Podejrzewałem, że to trzeba najpierw zrobić, jednak szukałem na Google i nadal nie wiem jak.

Wątek jest uruchamiany poprzez: Twatek.Create(false); dodanie Twatek.Create(true); niczego nie zmienia.

0

Niestety, zwraca taki błąd:
//
[Error] Unit1.pas(80): This form of method call only allowed for class methods//

0

W jaki sposób to ustawić? Jeśli chodzi o Delphi to jestem na prawdę początkujący.

0

Spakuj swój projekt i wrzuć go tutaj, zobaczymy co jest nie tak ;)

0

jeśli jesteś na prawdę początkujący to nie bierz się za wątki tylko zacznij od podstaw!

0

• pokaż trochę kodu. wątek powinien mieć pętlę „while not Terminated”.
• nie należy ubijać wątków na siłę, tylko powiadomić je, by się zamknęły od wewnątrz. do tego służy metoda .Terminate(), która wbrew nazwie jedynie ustawia wątkowi pole Terminated na true (w tym momencie wyżej wymieniona pętla się zakończy). potem czekaj aż wątek sam się zakończy przy pomocy .WaitFor().
• jeśli wątek jest zblokowany (czeka na coś potencjalnie nieskończenie długo) to sprawa się komplikuje.

0
procedure TWatek.Execute;
begin
 {Zwolnienie wątku po zakończeniu}
 Watek.FreeOnTerminate;
 
 //operacje
end;
0

W wątku w tych pętlach co tam masz możesz dodać coś takiego:
if Application.Terminated then
Exit;

0

Witam,

próbowałem zastosować zaproponowane przez Was rozwiązanie, ale albo kod nie chciał się skompilować, albo pomimo zamknięcia okna aplikacji wciąż znajdowała się ona w procesach.

Poniżej zamieszczam kod:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  Tgo = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure Tgo.Execute;
begin

sleep(5000);

// Klikniecie przycisku escape

keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);

sleep(1000);

// Klikniecie przycisku enter

keybd_event(VK_RETURN, 0, 0, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);

sleep(1000);

// Zamkniecie aplikacji

Application.Terminate;

end;

procedure TForm1.FormShow(Sender: TObject);
begin
Tgo.Create(false);
end;   

end.
0

Sleep'a użyłem aby aplikacja, do której "kierowane" są te polecenia miała czas na zwrócenie wyników.

Więc czy ktoś z Państwa byłby w stanie poprawić dla mnie mój kod, tak aby działał zgodnie z założeniami, bo ja już wielu rzeczy próbowałem i niestety bez skutku :(

0

Czy na prawdę nikt nie jest w stanie pomóc początkującemu ;( ?

0

Czy początkujący może się zacząć uczyć podstaw zamiast brać się za wątki, z którymi nawet zaawansowani programiści mają problemy???

hint: use TTimer Luck

0

zrób sobie funkcję i używaj jej zamiast Sleep:

procedure my_wait(t: DWORD);
var
  koniec: DWORD
begin
  koniec:=GetTickCount()+t;
  while ((not Application.Terminated) and (GetTickCount()<koniec)) do
    Sleep(1);
end;

mogą być błedy bo dawno nie pisałem w delphi

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