Thread Durdurma ve Devam etme çalışmıyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

Thread olarak kullandığım bir Unit var form1'den bu unit içindeki threadı nasıl durdurup devam ettirebilirim

Thread Unit

Kod: Tümünü seç

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls,
  Dialogs, StdCtrls;

type
  MyThread = class(TThread)
  private
    { Private declarations }
  public
    procedure Execute; override;
    procedure yaz;
  end;


implementation

uses
   Unit1;


procedure MyThread.Execute;
begin
     //..yapılan işlemler
end;

procedure MyThread.yaz;
begin
  Suspend;
end;

end.

Form1

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  aThread: MyThread;
begin
  aThread.yaz;
end;
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen cozturk »

Çalışan örnek:

Kod: Tümünü seç

unit Unit1;

interface

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

type
  ThreadX = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  th: ThreadX;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ThreadX.Execute;
begin
  while not terminated do
  begin
    windows.Beep(500, 100); // çalıştığı belli oluyor :)
    Sleep(500);
  end;
  windows.Beep(1000, 2000); // bitiş sesi
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  th := ThreadX.Create(false);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  th.Suspend; // dur
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  th.Resume; // devam
end;

procedure TForm1.Button3Click(Sender: TObject);
begin // bitir

  th.Resume; // Beklemedeyken sonlandırılamıyor. Beklemedeyse çalışsın ve sonlansın diye çalıştırıyoruz.
  th.Terminate;  // Bitiş sesi duyuluyor. Thread  sonlanmış.
end;

end.
ThreadDeneme.zip
Thread durdurma, başlatma, sonlandırma
(7.18 KiB) 92 kere indirildi
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

Siz aynı form uzerinde thread kullanmışsınız.
Benim thread Sadece Unit' ten oluşuyor form1 den bu unit içindeki threade göndermek istiyorum
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen ertank »

carsoft yazdı:Siz aynı form uzerinde thread kullanmışsınız.
Benim thread Sadece Unit' ten oluşuyor form1 den bu unit içindeki threade göndermek istiyorum
Merhaba,

Gönderilen kod içinde nasıl yapabileceğiniz gönderilmiş aslında. Sizin ilk gönderdiğiniz kod içinde yapmak istediğiniz de neredeyse yapılmış. Ancak siz Thread nesnesini Create() etmediğiniz için kullanamamışsınız.

Aşağıdaki şekilde deneyebilir misiniz?
Unit2:

Kod: Tümünü seç

unit Unit2;

interface

uses
  Classes;

type
  MyThread = class(TThread)
  private
    { Private declarations }
  public
    procedure Execute; override;
    procedure yaz;
  end;

implementation

procedure MyThread.Execute;
begin
     //..yapılan işlemler
end;

procedure MyThread.yaz;
begin
  Suspend;
end;


end.
Unit1:

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  aThread: MyThread;
begin
  aThread := MyThread.Create(False);  // Thread nesnesini durdurulmuş olarak oluşturur
  aThread.Resume();  // Thread nesnesini devam ettirir
  aThread.Suspend(); // Thread nesnesinin çalışmasını durdurur
  aThread.Terminate(); // Thread nesnesine durma komutu gönderir. Ancak zorla durdurmaz
end;
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen cozturk »

Yeni örnekte thread, ayrı unit içerisinden çalışıyor.

Kod: Tümünü seç

unit Unit1;

interface

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

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

var
  th: threadX;

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  th.Suspend; // dur
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  th.Resume; // devam
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

  th.Resume; // beklemede iken sonlandırılamıyor. bu yüzden yeniden çalıştırıyoruz.
  th.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  th := ThreadX.Create(false);
end;

end.
Unit2:

Kod: Tümünü seç

unit Unit2;

interface

uses
  windows,Classes;

type
  ThreadX = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure ThreadX.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ ThreadX }

procedure ThreadX.Execute;
begin
  while not terminated do
  begin
    windows.Beep(500, 100); // çalıştığı belli oluyor :)
    Sleep(500);
  end;
  windows.Beep(1000, 2000); // bitiş sesi
end;

end.
 
Dosya ekleri
ThreadDenemeYeni.zip
(8.49 KiB) 86 kere indirildi
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

The handle is invalid (6) hatası alıyorum

Thread şu şekilde creat ediyorum

Kod: Tümünü seç

constructor TMythread.Create(suspended : Boolean);
begin
  FreeOnTerminate := True;
  inherited Create(suspended);
end;
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen cozturk »

Yukarıdaki örnek çalışıyor.
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

tamam ama benimki neden The handle is invalid (6) hatası veriyor anlamadım
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen cozturk »

Form içerisinden bu threadi başlatacak başka bir kod gerekir. Şuna benzer:

Kod: Tümünü seç

var th: TMythread


....

 th := TMythread.Create(false);
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

var zaten abi

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
 with  MyThread.Create(True) do
      begin
        //..yapılan işlemler
      end;
end;
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen ertank »

Sizin kodunuz Thread nesnesini çalışır şekilde oluşturuyor. Örnek kod ise durdurulmuş şekilde oluşturuyor. "MyThread.Create(False)" şeklinde deneyebilir misiniz?
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

Denedim yine olmadı anlamadım gitti

Kod: Tümünü seç

with  MyThread.Create(False) do
carsoft
Üye
Mesajlar: 138
Kayıt: 01 Ağu 2014 12:27

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen carsoft »

Thread error handle invalid (6) hatası

suspend resume çalışmıyor thread Unit2 koları

Kod: Tümünü seç

unit Unit2;
  
  
interface
  
  
uses
  Classes, Unit1, Windows, Messages, SysUtils;
   
type
  TTestThread = class(TThread)
  private
     
  protected
  
  
    procedure Execute; override;  
  end;
  
  
implementation
  
 
procedure TTestThread.Execute;
begin
  FreeOnTerminate:=true;
  form1.Button4.Click;
 
end;
  
 
end.

Difer form

Kod: Tümünü seç

unit Unit1;
  
  
interface
  
  
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdAntiFreezeBase, IdAntiFreeze, AdvSmoothProgressBar,
  BusinessSkinForm, bsSkinData, bsSkinCtrls;
  
  
type
  TForm1 = class(TForm)
    Button4: TButton;
    IdAntiFreeze1: TIdAntiFreeze;
    Label13: TLabel;
    Label12: TLabel;
    Label11: TLabel;
    AdvProgressBar1: TAdvSmoothProgressBar;
    bsSkinData1: TbsSkinData;
    bsCompressedStoredSkin1: TbsCompressedStoredSkin;
    bsBusinessSkinForm1: TbsBusinessSkinForm;
    Button1: TbsSkinSpeedButton;
    Button2: TbsSkinSpeedButton;
    button3: TbsSkinSpeedButton;
    IdHTTP: TIdHTTP;
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure bsSkinSpeedButton1Click(Sender: TObject);
    procedure bsSkinSpeedButton2Click(Sender: TObject);
    procedure bsSkinSpeedButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  
  
var
  Form1: TForm1;
 
  f: TFileStream;
  success: Boolean;
  
  
implementation
  
  
uses Unit2;
  
  
var
  NewThread: TTestThread;
 
  
{$R *.DFM}
  
  
procedure TForm1.Button4Click(Sender: TObject);
 
begin
 
  
 F := TFileStream.Create('dd.exe', fmCreate);
 F.Seek(0,soFromEnd);
 try
    IdHTTP.Get('http://deneme.com/deneme.exe', F);
  except
    showmessage('Dosya Bulunamadı');
end;
 FreeAndNil(F);
  F.Free;
   end;
  
  
  
  
  
  
procedure TForm1.FormCreate(Sender: TObject);
begin
application.ProcessMessages;
end;
  
  
procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
if AWorkMode = wmRead then
 begin
   AdvProgressBar1.Position := AWorkCount ;
   Label12.Caption := floatToStr(round(advProgressBar1.Position * 100 / advProgressBar1.Maximum)) + ' ' + '%'  ; //yüzde
   Label13.Caption := IntToStr(AWorkCount div 1024) + ' ';
  
  
end;
end;
  
  
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
 if AWorkMode = wmRead then
 begin
   AdvProgressBar1.Maximum := AWorkCountMax ;
   AdvProgressBar1.Position := 0 ;
   if AWorkCountMax>0 then Label11.Caption:=Inttostr(AWorkCountMax div 1024) + ' ';
  
  
 end
end;
  
  
procedure TForm1.bsSkinSpeedButton1Click(Sender: TObject);
begin
NewThread:=TTestThread.Create(False);
end;
  
  
procedure TForm1.bsSkinSpeedButton2Click(Sender: TObject);
begin
 
Button3.Enabled:=True;
Button2.Enabled:=False;
NewThread.Suspend;
end;
 
  
procedure TForm1.bsSkinSpeedButton3Click(Sender: TObject);
begin
 
Button2.Enabled:=True;
Button3.Enabled:=False;
NewThread.Resume;
end;
  
  
end.
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Thread Durdurma ve Devam etme çalışmıyor

Mesaj gönderen cozturk »

Thread hemen çalışıyor ve sonlanıyor.

Kod: Tümünü seç

procedure TTestThread.Execute;
begin
  FreeOnTerminate:=true;
  form1.Button4.Click;
 
end;
Thread tarafından yapılan tüm iş bu!. Suspend veya resume edilecek durum yok ki.

Kod: Tümünü seç

NewThread:=TTestThread.Create(False);  // >> zaten çalışır halde oluşturulmuş.  
Suspend olarak başlatılmış olsa da, resume komutuyla birlikte hemen çalışır ve sonlanır. Sebebi ise execute olayında bir döngü olmayışı.
Suspend, Resume yapmaya çalıştığınız esnada, çalışan bir thread mevcut değilse handle invalid (6) hatası oluşur.
Cevapla