thread in icine form koyma ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

thread in icine form koyma ?

Mesaj gönderen ovural »

daha önce yazdıım bi programda thread kullanayım dedim .. simdi tekrardan bir sürü kod yazma yerine o formu bi kanalın icine koydum

Kod: Tümünü seç

  TDen = class(TThread)
  private
    FForm:Tform3;
  protected
    procedure Execute; override;
  public
    constructor Create; 
  end;

constructor TAnimationThread.Create;
begin
  inherited Create(True);
  FForm := TForm3.Create(Application);
  FForm.Show;
  FreeOnterminate := True;
  Resume;
end; 

procedure TDen.Execute;
begin
    FForm.SpeedButton1.Click;
    While Not Terminated Do
    Begin
            Application.ProcessMessages;
    End;
end; 

var 
   kanal:array of TDen;
   i:integer;
begin
     Setlength(kanal,Deger);
     for i:=0 to deger-1 do
         kanal:=TDen.Create;
end;

kodlar örnek oldugu icin yanlışlıkyapmışolabilir mantıgı anlatma adına bunları yazdım ..

bundan sonraki kısım artık form3 te ilerliyor ..

belli işlemler yapıp formlar kapanıyor ..

simdi sorun su ..

tek bir kanal oluşturdugumda çalışıyor ..

ama kanalı artırdıgımda sadece 1 tanesi saglıklı calısıyor digerleri ilk işlemden sonra kalıyor ..

tabi form3 ile belirttigim kısımda form1 deki değişken ve componentler kullanıyor ..

Synchronize şilemi sadece kanala ait procedureler icin gecerli sanırsam ..
tabi form3 deki procedurelerde sıkıntı oluyor ?

baya bi uzattım ne dersiniz ?
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

VCL'leri Thread içinde bu şekilde kullanamazsın çünkü çoğu thread-safe değildir. Senin yaptığın şekilde birden fazla thread çalıştırılırsa çakılır.

Execute methodunda Form ile ilgili görsel bileşenlerin propertylerine erişeceğin zaman Synchronize methodunu kullanırsın.

Ör:

Kod: Tümünü seç

TDen = class(TThread)
private 
  FForm : TForm;
  FEditText: string;
  procedure UpdateEdit1Text;
....

procedure TDen.UpdateEdit1Text;
begin
   FForm.Edit1.text:= FEdit1Text;
end;

procedure TDen.Execute;
var
  I: Integer;
begin 
  while not Terminated do
  begin
      for I:= 0 to 10000 do
      begin
         FEdit1Text:= IntToStr(I);
         Synchronize(UpdateEdit1Text);
   
        // !!!!!!! Hatalı bir kullanım !!!!!!!
         FForm.Memo1.Lines.Append(IntToStr(I)); 

      end;
  end;
end;
Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

Mesaj gönderen ovural »

bikaç sayfa dolaştıktan sonra thread in icine form koymak yerine formun icindeki nesneleri koydum .. baya bi ugrastım ve sorunu cozdum program çalışyıor .. lakin çok nadir de olsa (herhangi bi kapat komutu olmamasına ragmen ) program tamamen hata mesajı sonlanmadan kapanıyor ..

bu konuda bilgisi olan varmı ?
Cevapla