Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Thread
#1

.zip   Thread.zip (Dosya Boyutu: 58,48 KB / İndirme Sayısı: 22)

Merhabalar 

Thread konularını incelerken nasıl ve ne şekilde aklımda kalmış ise işlemci çekirdek sayısınca işlem yaptırılabileceği diyelim ki 4 çekirdek işlemcili makinada 4 adet farklı işi arka planda (gibi) yaptırır gibi bir bilgi kalmış aklımda fakat bugün bir deneme yaparken üç tane thread açtım 3 işlemi de yapmasına yapıyor ama ekran donuyor başka bir iş yapmama müsade etmiyor. 2 tane thread çalıştırırsam sorun yok ön yüzde işlem yapabiliyorum formu sağa sola taşıyabiliyorum örnek yaptığım dosyayı da eke ekliyorum size zahmet yardımcı olursanız çok minnete geçer.
#2
(05-03-2019, Saat: 17:18)osiso Adlı Kullanıcıdan Alıntı: Merhabalar 

Thread konularını incelerken nasıl ve ne şekilde aklımda kalmış ise işlemci çekirdek sayısınca işlem yaptırılabileceği diyelim ki 4 çekirdek işlemcili makinada 4 adet farklı işi arka planda (gibi) yaptırır gibi bir bilgi kalmış aklımda fakat bugün bir deneme yaparken üç tane thread açtım 3 işlemi de yapmasına yapıyor ama ekran donuyor başka bir iş yapmama müsade etmiyor. 2 tane thread çalıştırırsam sorun yok ön yüzde işlem yapabiliyorum formu sağa sola taşıyabiliyorum örnek yaptığım dosyayı da eke ekliyorum size zahmet yardımcı olursanız çok minnete geçer.

Çok tehlikeli sularda geziyorsunuz. Thread'lerin içinden ana thread'in içindeki nesnelere erişip kullanmaya çalışmışsınız. Bu son derece hatalı bir davranış. Thread'ler ile ilgili bir çok makale ve paylaşımlarımız mevcut, bunları okumanızı ve özümsemeye çalışmanızı önerebilirim.

Ayrıca bir dipnot olarak şunu ilave edeyim; aynı anda çalışması önerilen thread sayısı çekirdek sayısı * 2 kadardır. Ama bu sadece bir tavsiyedir. Daha fazlasını ya da daha azını da kullanabilirsiniz. Burada bilinmesi ve asla unutulmaması gereken şudur: "Kaynaklarımız sınırlıdır ve bu sınırlı kaynakları tüketmek isteyenlerin sayısı oldukça fazladır". Bu nedenle ; önemli olan birden fazla thread destekli uygulama yazmak değildir; önemli olan sınırlı ve paylaşımlı kaynakları iyi yönetebilmektir. Bu istikamet de sizi; çeşitli senkronizasyon nesneleri ile tanıştırır.

Gerisi size kalmış...
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
#3
Öncelikle kodunuzu zip olarak eklemenize gerek yoktu. Aşağıdaki gibi ekleyebilirdiniz: 

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
     Memo1: TMemo;
     Button1: TButton;
     Memo2: TMemo;
     Memo3: TMemo;
     ComboBox1: TComboBox;
     Button2: TButton;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
  private

     { Private declarations }
  public

     { Public declarations }
  end;

  thread1 = class(TThread)
     procedure execute; override;
  end;

  thread2 = class(TThread)
     procedure execute; override;
  end;

  thread3 = class(TThread)
     procedure execute; override;
  end;

var
  Form1: TForm1;
  i, f, g: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
  begin
     thread1.create;
     thread2.create;
  end;

  if ComboBox1.ItemIndex = 1 then
  begin
     thread1.create;
     thread2.create;
     thread3.create;
  end;
end;

procedure thread1.execute;
begin
  for i := 1 to 2000 do
  begin
     Form1.Memo1.Lines.Add(IntToStr(i));
  end;
end;

procedure thread2.execute;
begin
  for f := 1 to 2000 do
  begin
     Form1.Memo2.Lines.Add(IntToStr(f));
  end;
end;

procedure thread3.execute;
begin
  for g := 1 to 2000 do
  begin
     Form1.Memo3.Lines.Add(IntToStr(g));
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;

  Memo2.Clear;

  Memo3.Clear;
end;

end.

Ayrıca Delphi'nin Ctrl + D kısayolunu ya da pas dosyası üzerinde sağ click, Format Source'u deneyin  Rolleyes

Thread konusu derin bir konudur, bu konuya aşağıdaki @Tuğrul HELVACI hocamın makalelerine okuyarak başlasanız sizin için yararlı olacaktır. 

Derinlemesine Threading..(1)

Derinlemesine Threading..(2)

Derinlemesine Threading..(3)

VCL GUI objeleri thread safe değildir ve senkronizasyon mekanizmalarını kullanmanız gerekir. 

Ayrıca thread sayısı eşittir cpu sayısı da maalesef doğru değil baya bir yanlışınız var ne yazık ki  Sad
#4
ikili thread ve üçlü thread çalışırken sorunlar anlaşılabilir olsun diye zipleyip gönderdim thread konusu şimdiye kadar hiç lazım olmadı ama yapsam olur dediğim bir program için sordum soruyu birde cevap tam alamadım iki tane yi yaparken üç taneyi yapmamasının sebebi nedir.?
#5
(05-03-2019, Saat: 19:30)osiso Adlı Kullanıcıdan Alıntı: ikili thread ve üçlü thread çalışırken sorunlar anlaşılabilir olsun diye zipleyip gönderdim thread konusu şimdiye kadar hiç lazım olmadı ama yapsam olur dediğim bir program için sordum soruyu birde cevap tam alamadım iki tane yi yaparken üç taneyi yapmamasının sebebi nedir.?

Kodunuza göre aslinda tek bir thread calistirirken de sorununuz var ama bir sekilde denk gelmiyorsunuz. sayiyi 3 e cikartinca (aslinda bu main thread ile birlikte 4 tür) probleminiz her an elle tutulur gözle görülür hale geliyor.. 4-6-7 yapsaniz durum daha da berbat olacak. 2 oluyor 3 olmuyor gibi bir anlam cikartmayin bundan aslinda 2 de olmuyor.
#6
(05-03-2019, Saat: 17:39)edo Adlı Kullanıcıdan Alıntı: Öncelikle kodunuzu zip olarak eklemenize gerek yoktu. Aşağıdaki gibi ekleyebilirdiniz: 

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
     Memo1: TMemo;
     Button1: TButton;
     Memo2: TMemo;
     Memo3: TMemo;
     ComboBox1: TComboBox;
     Button2: TButton;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
  private

     { Private declarations }
  public

     { Public declarations }
  end;

  thread1 = class(TThread)
     procedure execute; override;
  end;

  thread2 = class(TThread)
     procedure execute; override;
  end;

  thread3 = class(TThread)
     procedure execute; override;
  end;

var
  Form1: TForm1;
  i, f, g: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ComboBox1.ItemIndex = 0 then
  begin
     thread1.create;
     thread2.create;
  end;

  if ComboBox1.ItemIndex = 1 then
  begin
     thread1.create;
     thread2.create;
     thread3.create;
  end;
end;

procedure thread1.execute;
begin
  for i := 1 to 2000 do
  begin
     Form1.Memo1.Lines.Add(IntToStr(i));
  end;
end;

procedure thread2.execute;
begin
  for f := 1 to 2000 do
  begin
     Form1.Memo2.Lines.Add(IntToStr(f));
  end;
end;

procedure thread3.execute;
begin
  for g := 1 to 2000 do
  begin
     Form1.Memo3.Lines.Add(IntToStr(g));
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;

  Memo2.Clear;

  Memo3.Clear;
end;

end.

Ayrıca Delphi'nin Ctrl + D kısayolunu ya da pas dosyası üzerinde sağ click, Format Source'u deneyin  Rolleyes

Thread konusu derin bir konudur, bu konuya aşağıdaki @Tuğrul HELVACI hocamın makalelerine okuyarak başlasanız sizin için yararlı olacaktır. 

Derinlemesine Threading..(1)

Derinlemesine Threading..(2)

Derinlemesine Threading..(3)

VCL GUI objeleri thread safe değildir ve senkronizasyon mekanizmalarını kullanmanız gerekir. 

Ayrıca thread sayısı eşittir cpu sayısı da maalesef doğru değil baya bir yanlışınız var ne yazık ki  Sad

@Tuğrul HELVACI Hocamın bu makaleleri çok iyi
ben faydalandım.. tavsiye ederim..
#7
(05-03-2019, Saat: 19:30)osiso Adlı Kullanıcıdan Alıntı: ikili thread ve üçlü thread çalışırken sorunlar anlaşılabilir olsun diye zipleyip gönderdim thread konusu şimdiye kadar hiç lazım olmadı ama yapsam olur dediğim bir program için sordum soruyu birde cevap tam alamadım iki tane yi yaparken üç taneyi yapmamasının sebebi nedir.?

Arzu ettiğiniz cevabı alamamanızın nedeni, acaba size verilen tavsiyeleri, önerileri, bilgileri kulak ardı ederek araştırma ve öğrenme sürecinden geçmemeniz olabilir mi ?
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
#8
(06-03-2019, Saat: 08:46)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:
(05-03-2019, Saat: 19:30)osiso Adlı Kullanıcıdan Alıntı: ikili thread ve üçlü thread çalışırken sorunlar anlaşılabilir olsun diye zipleyip gönderdim thread konusu şimdiye kadar hiç lazım olmadı ama yapsam olur dediğim bir program için sordum soruyu birde cevap tam alamadım iki tane yi yaparken üç taneyi yapmamasının sebebi nedir.?

Arzu ettiğiniz cevabı alamamanızın nedeni, acaba size verilen tavsiyeleri, önerileri, bilgileri kulak ardı ederek araştırma ve öğrenme sürecinden geçmemeniz olabilir mi ?

yok hocam ben okudum makalenizi daha önce de okumuştum dün tavsiye verildiğinde de mesajımı yazmadan önce tekrar okudum hatta dün akşam eve geçtiğimde programı tekrar çalıştırdığımda zaman zaman üç threadin de hem çalışıp hemde yanıt vermiyor a düştüğünü de gözlemledim. bazen arka planda çalışıyor bazen çalışmıyor dün gündüz hiç çalışmamıştı konu ile ilgili zaten sizin yazılarınızdan her zaman faydalanıyorum ben sadece iki thread çalışırken sorun yok üçüncü thread çalışırken niçin böyle sorun oluyor bu fark ile ilgili bir açıklama beklemiştim yani bak arkadaş şöyle yaparsan sorun yaşamazsın gibi yani bilmediğim bir şey mi var acaba yada yapmadığım bir şey mi var acaba kısmındaydım. isterseniz size bir örnek vereyim ramazan ayında anne thread yemek yapmak için mutfağa gidiyor baba thread de masayı kurmak için kalkıyor ama çocuk thread niçin bakkala gitmiyor. yada çocuk thread bakkala gidiyor ama niye ezan okunana kadar yanıt vermiyor oluyor yada niçin o zamana kadar başka işlem yapamıyorum sorun sistemde mi yazılımda mı yoksa ben mi çok şey istiyorum bilmem anlatabildim mi ? hem sizin makalelerinizi okuduğumu hemde sorunumu?
#9
(06-03-2019, Saat: 09:20)osiso Adlı Kullanıcıdan Alıntı:
(06-03-2019, Saat: 08:46)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Arzu ettiğiniz cevabı alamamanızın nedeni, acaba size verilen tavsiyeleri, önerileri, bilgileri kulak ardı ederek araştırma ve öğrenme sürecinden geçmemeniz olabilir mi ?

yok hocam ben okudum makalenizi daha önce de okumuştum dün tavsiye verildiğinde de mesajımı yazmadan önce tekrar okudum hatta dün akşam eve geçtiğimde programı tekrar çalıştırdığımda zaman zaman üç threadin de hem çalışıp hemde yanıt vermiyor a düştüğünü de gözlemledim. bazen arka planda çalışıyor bazen çalışmıyor dün gündüz hiç çalışmamıştı konu ile ilgili zaten sizin yazılarınızdan her zaman faydalanıyorum ben sadece iki thread çalışırken sorun yok üçüncü thread çalışırken niçin böyle sorun oluyor bu fark ile ilgili bir açıklama beklemiştim yani bak arkadaş şöyle yaparsan sorun yaşamazsın gibi yani bilmediğim bir şey mi var acaba yada yapmadığım bir şey mi var acaba kısmındaydım. isterseniz size bir örnek vereyim ramazan ayında anne thread yemek yapmak için mutfağa gidiyor baba thread de masayı kurmak için kalkıyor ama çocuk thread niçin bakkala gitmiyor. yada çocuk thread bakkala gidiyor ama niye ezan okunana kadar yanıt vermiyor oluyor yada niçin o zamana kadar başka işlem yapamıyorum sorun sistemde mi yazılımda mı yoksa ben mi çok şey istiyorum bilmem anlatabildim mi ? hem sizin makalelerinizi okuduğumu hemde sorunumu?



Derinlemesine Threading..(1) konusunun altındaki yorumlara bakarsanız orada @Tuğrul HELVACI  hocanın şu yorumu var: 

Alıntı:VCL konusuna gelince o konu hakkında şu aşamada yapılabilecek pek fazla şey yok maalesef Sad Thread çalışma mekanizmalarında bir thread’e dışarıdan gelen SendMessage çağrıları ortalığı hallaç pamuğu gibi atabiliyor. Herne kadar GetMessage yordamı önce başka thread’lerden gelen SendMessage çağrılarını işlese de o anda thread’in bir şekilde bloke olması göndereni de bloke ediyor.

Bu sebeple VCL’i thread içinde kullanmak şu aşamada her zaman beklenmedik sorunlara neden olabiliyor. Görsel bileşenler halihazırda işletim sisteminden gelen tonlarca mesaja yanıt verdikleri için thread’ler içinde güvenle kullanılmaları şu tasarım hali ile pek mümkün değil. İlerleyen zamanlarda VCL’in thread güvenli hale getirilmesi yönünde istekler var ama bu isteklere Embarcadero ‘da pek sıcak bakmıyor sanırım.

Pek kolay bir iş olduğu söylenemez çünkü. Dolayısı ile, VCL görsel nesnelerine illa da thread’lerimiz içinden erişmemiz gerekiyor ise klasik çözüm Synchronize’a başvurmamız en güvenli yol gibi görünüyor.

Yukarı yazdığım mesajda da bunu ima etmeye çalıştım size.
#10
(06-03-2019, Saat: 09:20)osiso Adlı Kullanıcıdan Alıntı:
(06-03-2019, Saat: 08:46)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Arzu ettiğiniz cevabı alamamanızın nedeni, acaba size verilen tavsiyeleri, önerileri, bilgileri kulak ardı ederek araştırma ve öğrenme sürecinden geçmemeniz olabilir mi ?

yok hocam ben okudum makalenizi daha önce de okumuştum dün tavsiye verildiğinde de mesajımı yazmadan önce tekrar okudum hatta dün akşam eve geçtiğimde programı tekrar çalıştırdığımda zaman zaman üç threadin de hem çalışıp hemde yanıt vermiyor a düştüğünü de gözlemledim. bazen arka planda çalışıyor bazen çalışmıyor dün gündüz hiç çalışmamıştı konu ile ilgili zaten sizin yazılarınızdan her zaman faydalanıyorum ben sadece iki thread çalışırken sorun yok üçüncü thread çalışırken niçin böyle sorun oluyor bu fark ile ilgili bir açıklama beklemiştim yani bak arkadaş şöyle yaparsan sorun yaşamazsın gibi yani bilmediğim bir şey mi var acaba yada yapmadığım bir şey mi var acaba kısmındaydım. isterseniz size bir örnek vereyim ramazan ayında anne thread yemek yapmak için mutfağa gidiyor baba thread de masayı kurmak için kalkıyor ama çocuk thread niçin bakkala gitmiyor. yada çocuk thread bakkala gidiyor ama niye ezan okunana kadar yanıt vermiyor oluyor yada niçin o zamana kadar başka işlem yapamıyorum sorun sistemde mi yazılımda mı yoksa ben mi çok şey istiyorum bilmem anlatabildim mi ? hem sizin makalelerinizi okuduğumu hemde sorunumu?

Sevgili kardeşim, bu konu ile ilgili makale okumana sevindim. Lâkin ben thread ile ilgili yazdığım makale, yorum vb. şeylerin nerede ise hepsinde; bir başka thread içinden ana thread içindeki nesnelere senkronizasyonsuz erişmeyin demeye çalışıyorum. Ortak kullanılan alanlara erişimi senkronize etmelisiniz. Thread programlamanın en meşakkatli tarafı budur zaten.

Bir masa var, masada bir tabak ve bir kaşık var; karnı acıkmış 3 kişi var. 3'ü birden masaya ve tabağa hücum eder ise, muhtemelen yemek dökülür ve herkes aç kalmaya devam eder. Herkes sıra ile masanın başına oturur ise, hepsi doyar. Siz, bu arkadaşları masaya oturtan ve bir sonraki aç vatandaşın sofraya oturmasını sağlayan iri yarı/kaslı organizatörsünüz. Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Thread içinde CoInitialize(nil) ve CoUninitialize serdar 6 1.067 22-08-2023, Saat: 09:50
Son Yorum: yhackup
  Thread Socket (Yardım) hkeskin 1 1.387 11-07-2023, Saat: 12:47
Son Yorum: delphiman
  Thread pool mantığı nasıl kurulmalı ? mrmarman 12 3.162 16-12-2021, Saat: 20:45
Son Yorum: Tuğrul HELVACI
Question Bu thread kullanımı doğrumu ? seci20 0 667 05-09-2021, Saat: 12:55
Son Yorum: seci20
  3D lidar veri analizi için PPL veya Thread nuheroglu 17 5.262 02-08-2021, Saat: 10:35
Son Yorum: omeraksit05



Konuyu Okuyanlar: 1 Ziyaretçi