thread ve işlemci sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

thread ve işlemci sorunu

Mesaj gönderen bulutsuzluk_35 »

Merhabalar

Arkadaşlar ben com portu okumak amaçlı indy deki okuma yönteminden kopya çekerek bunu kendi componentime uyarladım.
Bu com okuma thread ımıda form.show olayında create ediyorum.Ancak thread oluştuğunda birden cpu kullanımı 100de100e ulaşıyor.Buda bana sıkıntı oluşturuyor.
kod şu

Kod: Tümünü seç

  type
  TReadingThread = class(TThread)
  private
    FConn: TnrComm;
  protected
    procedure AfterConstruction; override;
    procedure Execute; override;
  public
    constructor Create(AConn: TnrComm); reintroduce;
  end;
  var
  ReadingThread: TReadingThread = nil;
burada tanımlama ve

Kod: Tümünü seç

procedure TReadingThread.Execute;
var
  S: String;
begin
  while not Terminated do
  begin
    S := FConn.ReadString;
    if S<>'' then
    begin
      buffertext:=buffertext+S;
      Form1.Timer9.Enabled:=True;
    end;
    S:='';
  end;
end;
buda işleyen kısım

Kod: Tümünü seç

  ReadingThread:=TReadingThread.Create(nrComm1);
buda başlatma

başlatmadığım zaman cpu kullanımı 100de 5 lerde ama başlattığım zaman 100de100 tek çekirdek p4 makina çift çekirdekte denedim 100de50 kullnıyor.Lütfen en kısa zamanda cevaplarınızı bekliyorum.Cevap veren herkese şimdiden teşekkürler
iyi çalışmalar...

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: thread ve işlemci sorunu

Mesaj gönderen unicorn64 »

Form1.Timer9 un timer eventinde neler yapıyorsun acaba??
bi de thread içinde timer a neden ihtiyaç duydun ki?

işlemleri timer da yapıyorsan neden thread var, thread varken timer a neden ihtiyaç oldu?

bir de işlemci için execute olayında döngü içinde sleep(1) yazki işlemcin arada senin programdan başka işler yapmaya da fırsat bulsun
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: thread ve işlemci sorunu

Mesaj gönderen sadettinpolat »

while dongusunun icine sleep komutu ekle islemci her dongude biraz nefes alsin.

http://tr.delphipeak.com/2006/07/25/ned ... igimiz.htm
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: thread ve işlemci sorunu

Mesaj gönderen undefined »

Döngünün işlemciyi bu kadar meşgul ettiğini düşünmüyorum, çünkü readstring blocking bir işlem.
Thread içinden Form1.Timer9.Enabled:=True yapman sakıncalı bir durum. Bunu ayrı bir procedure e yazıp, sonra onu synchronize etmen gerekli.
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: thread ve işlemci sorunu

Mesaj gönderen bulutsuzluk_35 »

arkadaşlar cevaplar için teşekkür ederim.
Sorunumu setthreadprioty komutu ile hallettim.Yani thread ımı create ettikten sonra bu komutu uyguladım ve iletişim problemimi çözdüm seri port izleme programları ilede baktım ve normalde bu komut olmadan porttan misal 100 okuma yapıyordu denediğim komutla 1400 okuma yapıyor.Şimdilik sorunum çözülmüş gözüksede işlemci kullanımının hala 100de 100 olması açıkçası biraz beni endişelendiriyor.Umarım bir problem olmaz şimdilik programımı teslim ettim.Yaptığım işin son aşamada böyle bi sorun çıkarması beni gerçekten korkutmuştu ama kısa vadede yapabileceğimi yaptım şükür.Ama bundan sonra bu konuda daha dikkatli olmam gerek sanırım.
Ha bu arada yanlış anlaşılmasın benim sorunum kendi threadımda olmuyordu
benim okumam sorunsuzdu(cihazlarım-ben) ama program çalışırken modbus üzerinden başka bir makina(ben-modbus) ile haberleşmem gerekiyordu.Ve benim kanal işlemciyi bu denli yorunca diğer okuma işlemi tam olarak devam edemiyor aksıyordu.
setthreadprioty(benimkanal.handle,lowest) ile benim kanalın önemini azalttım böylece diğer (modbus-ben) kanal ki bu kanal benim değil ole bağlantısı ile veri aldığım başka bir programın kanalı rahatlamış ve iletişim kurulmuş oldu

Umarım anlatabilmişimdir..
İyi Çalışmalar...Kolaygelsin.

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: thread ve işlemci sorunu

Mesaj gönderen Hakan Can »

Ustalar ısrarla Sleep(1) demişler.

While döngüsünün arasına bence de Sleep(1) koysan CPU yüzde 0.1'lere düşer.

Tabi Thread içinde sabit bir formla direk irtibat kurma meselesi de çok ciddi bir programlama hatası. Problem olmaz olmaz ama oldu mu da uğraştırır.

Gerçi işin görülüyorsa fazla da sorun yapmaya gerek yok.

İyi çalışmalar.
Cevapla