thread hk

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
master_20
Üye
Mesajlar: 85
Kayıt: 27 Eki 2010 09:42

thread hk

Mesaj gönderen master_20 »

Merhaba arkadaşlar, tcp client ile client dinlediğim bir threadım var, kullanıcının bağlantısı koptuğunda ya da bir şekilde sunucula bağlantısı kesildiğinde haliyle tcpclient hataya düşüyor ve thread da sorunlar oluşmaya başlıyor. tcp client ı bu durumda kontrol edip tekrar sunucuya bağlıyorum. sunucuya mesaj gönderreibliyor ama gelen mesajları okuması için yazdığım thread hata verdiği için tekrar çalışmıyor. hataya düşen threadı nasıl kontrol edebilirim ? ya da nasıl çalıştırabilirim. fikirlerinizi bekliyroum
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: thread hk

Mesaj gönderen freeman35 »

indy gibi 3parti bileşenleri kullan, bunlarıda thread içine almana gerek yok, kodlarını hatırlamıyorum, ama yanılmıyorsam kendisi thread kullanıyor, ayrıca senin yazmana gerek yok. Sen onreceive eventine kodunu yaz sadece, mesaj gelince o zaten tetikliyecektir.
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: thread hk

Mesaj gönderen G.Arkas »

@Freeman dediği gibi, Indy AThread.Connection kullanır. Tüm işlemleri Thread içerisindedir. Bu yüzden diğer socket bağlantı tiplerine (Örn: Pure WinSock) göre daha yavaş ama sağlam çalışır. Bağlantını sonlandırmak yada ilgili bağlantıya müdahale etmek için AThread.Connection.Disconnect demen yeterli olacaktır.
Resim
master_20
Üye
Mesajlar: 85
Kayıt: 27 Eki 2010 09:42

Re: thread hk

Mesaj gönderen master_20 »

konuyla ilgili cahilliğime verin ama internette araştırma yaptığıma göre yada anladığıma göre indy nin tcp client ını sürekli readln modda tutmak için ya timer ya da thread kullanmak gerekiyormuş, diğer türlü readln tutmak için ne yapmam gerekiyor kısa bir algoritma verebilecek varmı ? bende araştırıyorum bulursam burada paylaşacağım
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: thread hk

Mesaj gönderen ikra »

Cok baglanti olacaksa indy kullanmak büyük hata olur.
Indy client basina bir thread olusturur.
kıdemsiz üye
master_20
Üye
Mesajlar: 85
Kayıt: 27 Eki 2010 09:42

Re: thread hk

Mesaj gönderen master_20 »

Yaklasik 125 client baglanacak, ne onerirsiniz peki?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: thread hk

Mesaj gönderen mrmarman »

Kendi projelerimde TServerSocket, TClientSocket kullanıyorum ve herhangi bir ikinci bir thread ihtiyacım olmadı.

Hata olduğundan zaten bunu yakalayabiliyor bertaraf edebiliyorsunuz.
Hataya meydan veren client'in IP'sini de bildiğinizden onu listeden düşüp loglayabiliyorsunuz da...

Hata kodlarını CASE ile isimlendirebilmekle birlikte...

ServerSocket ile ve ClientSocket için ayrı ayrı error oluştuğunda... kısaca şundan bir ServerSocket bir de ClientSocket için deneyin... Hata projenizi bloke etmeden LOG ile değerlendirilip, 0 kodu ile bertaraf edilecektir.

Kod: Tümünü seç

procedure TForm1stMenu.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  MemoLog.Lines.Add( Format( 'Server - ErrorCode = %d', [ErrorCode] ) );
  ErrorCode := 0;
end;
Zaten Socket.RemoteAddress ile IP'sini de alabildiğinizi hatırlıyorsunuzdur. Böylece IP bazında hataya sebebiyet veren clienti soruşturabilirsiniz de...
Resim
Resim ....Resim
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: thread hk

Mesaj gönderen SimaWB »

Mecbur kalmadıkça Indy kullanmıyorum. Bir çok projede Synapse kullandım. CPU/RAM kullanımı sizin için önemli ise tavsiye ederim.
There's no place like 127.0.0.1
Cevapla