Wykonanie wątku przy zamykaniu i prawidłowe zamknięcie formatki.

0

Cześć.

Problem jest lamerski i banalny. Ale nie mogę dojść jak to zrobić. Chcę wykonać wątek w momencie zamykania formatki. I zamknąc formatkę dopiero gdy się wykona,

Wątek ten ukrywa jedne kontrolki na formatce głownej, pokazuje inne w tym postęp dłuższej operacji. Jednak wywołanie w wątku tworzonym przez CreateThread polecenia Close powoduje albo błąd 1400 albo jak robię Free to błąd 5. Natomiast Application.Terminatenie robi nic.

I tutaj pytanie jak wykonać wątek zmieniający na przykład postęp ProgressBara, a następnie gdy zakończą się czynnośc w wątku zamknąć prawidłowo formatkę? Do tej pory tworzyłem nową i pokazywałem ją przez ShowModal, a gdy wątek kończył pracę zamykałem ją.

Proszę o pomoc z przykładami kodów. Wiem, że problem jest pewnie banalny, ale kodowałem cały dzień, mało spiąć, stąd pewnie zaćmienie umysłu. Z góry dziekuję.

0

Użyj TThread Close rób w OnTerminate.

0

Wolałem pod WinAPI. Ale jeśłi trzeba TTHread to ok. Tylko chyba się nie do końca zrozumielismy. Chcę zrobić takie coś. Że zannim zamknie się formatka, wykona się mój wątek do kónca na jedynej gownej formatce. Następnie formatka wraz z całą aplikacją ma zostać zamknięta. Można prosty przykład jak to ztobić ok? Bo póki co źle coś robię i mam błędy 1440 albo Formatka zamyka się bez błędów, jednak pod IDE widac, że program bez okna nadal "wisi".

3
unit Unit26;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TCloseThread=class(TThread)
  protected
    procedure Execute;override;
  public
    constructor Create;
  end;

var Form1:TForm1;

implementation

{$R *.DFM}

procedure TCloseThread.Execute;
var I:Integer;
begin
  for I:=9 downto 0 do
  begin
    Form1.Label1.Caption:=IntToStr(I);
    Sleep(1000);
  end;
  Terminate;
end;

constructor TCloseThread.Create;
begin
  inherited Create(false);
  FreeOnTerminate:=false;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var Th:TCloseThread;
begin
  Th:=TCloseThread.Create;
  try
    while not Th.Terminated do Application.ProcessMessages;
  finally
    Th.Free;
  end;
end;

end.
0

Dziękuję o to chodziło. A na problemy z innymi wątkami pod WinAPI pomagało wykonanie SuspendThread w OnClose i juz nie ma żadnych AV ani błędów o wspomnianych wcześniej kodach.

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