błąd podczas zamykania aplikacji

0

Dlaczego jak zamykam aplikację powstaje błąd "Raise Exception"?

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

TWatek = class(TThread)
public
procedure Execute; override;
end;


var
  Form1: TForm1;
  watek: TWatek;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
     
watek:=TWatek.Create(false);
end;

procedure TWatek.Execute;
var x:Integer;
begin
   
 for x:=0 to 10000000 do
begin
Form1.Button1.Caption:=IntToStr(x);
end;

end; 
0

Zapewne w momencie zamykania następuje moment, w którym Button1 albo Form1 zostały już zniszczone, a wątek jeszcze jedzie — i próbuje się odwołać do kontrolek, których już nie ma.

Popełniasz też błąd: wszelkie odwołania do kontrolek z innego wątku trzeba robić przez Synchronize(). I od tego bym zaczął.

0

zrobiłem tak

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

TWatek = class(TThread)
private
x:Integer;
procedure maluj;
public
procedure Execute; override;
end;


var
  Form1: TForm1;
  watek: TWatek;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  but: TButton;
  
begin
button1.Caption:='tworzę button';
but:=TButton.Create(Self);
but.Left:=20;
but.Top:=100;
but.Width:=100;
but.Height:=40;
but.Parent:=Self;
but.Visible:=true;
     
watek:=TWatek.Create(false);
end;

procedure TWatek.Execute;
var a:Integer;
begin
for a:=0 to 10000000 do

begin
x:=a;
Synchronize(maluj);
end;

end;

procedure TWatek.maluj;
begin
    Form1.Button1.Caption:=IntToStr(x);
end; 

i błąd nie wyskakuje. Dzięki. Ale dlaczego zmienna **a **nie może być zadeklarowana globalnie w klasie?

0

Ale dlaczego zmienna a nie może być zadeklarowana globalnie w klasie?

Skoro nie podajesz błędu to chyba oczekujesz odpowiedzi w stylu: Bo nie.

Nie widzę sensu żeby zmienną indeksową definiować globalnie. Mądrze byłoby dodać tego fora do środka synchronize i wywoływać raz, bo coś mi się wydaje że wywołanie RAZ synchronize będzie krócej trwać niż to twoje iluśkrotne synchronizowanie... Ale widać po prostu lubisz robić wolne programy...

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