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

Odpowiedz Nowy wątek
2011-08-03 10:24
pdelhi
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ę?

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-08-03 10:32
0

Zatrzymaj najpierw wątki.

Pozostało 580 znaków

2011-08-03 11:46
pdelhi
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.

A niby dlaczego utworzenie następnego wątku miałoby zatrzymać poprzedni? Spróbuj 'TWatek.Free'. - Patryk27 2011-08-03 11:48
TWatek.Free na 100% zadziała... :/ - Misiekd 2011-08-03 12:13

Pozostało 580 znaków

2011-08-03 11:56
pdelhi
0

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

Ustal, żeby wątek zamykał się automatycznie po jego zakończeniu. - Opi 2011-08-03 12:05

Pozostało 580 znaków

2011-08-03 16:00
pdelhi
0

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

Pozostało 580 znaków

2011-08-03 16:03
Oskar Czarny
0

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

Pozostało 580 znaków

2011-08-03 16:43
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-08-03 16:55
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.

edytowany 2x, ostatnio: Azarien, 2011-08-03 16:57
A Halt() to przypadkiem nie ubijało całej aplikacji tak brutalnie po niemiecku? - O_o 2011-08-03 17:00
Halt stosuje się w ostateczności. Poza tym to spowoduje wyciek pamięci. - Opi 2011-08-03 17:43
A to już system powinien się tym przejmować. ;) - O_o 2011-08-03 17:47
halt nie spowoduje wycieku, bo wszystko ubije system. ale tak się nie robi, bo mogły zostać otwarte niezapisane pliki itp. - Azarien 2011-08-03 18:36
Właściwie, to halt spowoduje wyciek, ale jakie to ma znaczenie skoro po chwili system wszystko sobie odzyska. W każdym razie używając np. heaptrc zauważy się wyciek, gdyż wykona on się jeszcze zanim program do końca się zamknie. To tak gwoli wyjaśnienia ;) . - payl 2011-08-04 00:46
Jak w dawnych czasach robiłem w Delphi to dawałem opcje ubicia Haltem jako bosskey. Użyszkodnicy to chwalili. ;) - O_o 2011-08-04 01:56

Pozostało 580 znaków

2011-08-03 17:42
Opi
0
procedure TWatek.Execute;
begin
 {Zwolnienie wątku po zakończeniu}
 Watek.FreeOnTerminate;
 
 //operacje
end;

Pozostało 580 znaków

2011-08-04 11:08
0

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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-08-09 23:57
pdelhi
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.
jedyne co mi przychodzi na myśl to WTF??? - Misiekd 2011-08-10 00:11
"Wykonanie skrótów wrzuciłem do wątku, bo w innym wypadku cała aplikacja się przycinała" - po co robisz sleep? - areksum 2011-08-10 09:12
To już zupełnie inna sprawa że nie musiał używać wątków które są zbyt trudne jak na jego poziom... - payl 2011-08-10 15:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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