1

Konu: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Herkese merhabalar

14 sene evvel tasarladığım bir cihaz halen çalışıyor. Ama boyası dökülüyor, pas bile oluşan cihazlar var.
Ve müşteriler yıllardır isyan bayraklarını gittikçe daha yükseklere asıyorlar.
Ve yıllardır ben yeni cihazı tasarlıyorum, ha tasarladım ... çok az kaldı ...
Neyse; sonunda yeni cihaz tasarlandı, üretildi ... ve çalışıyor.

PC tarafında yazılımın sadece haberleşme bölümünü değiştirerek Rs485 yerine Ethernet kullanmak istiyorum.
Ve yoğun bir yük olmadığı için UDP bana yetiyor.

Debugger ile adım adım gittiğimde, herşey istediğim gibi çalışıyor.
Ama işin içinde debugger olmayınca:
- UDP paketi PC'den çıkıyor
- Cihaz paketi alıyor
- 1 veya 2ms içine cevap veriyor.
Ama Vfp programın içinde Winsock'un DataArrival() event tetiklenmiyor.

Ama Debugger ile Winsock'un SendData satırında durakladığımda ve F6'ya bastığımda, cevap anında algılanıyor.
Veya Debugger ile SendData'dan hemen sonrasına bir Breakpoint koyduğumda, o zamanda veriler geliyor.
Üzücü sonuç: No-Breakpoint == No-Data!

Denediklerim:
SendData'nın önüne ve arkasına her türlü Delay'ler, DoEvents'ler ... artık ne varsa. Ve tümünü _VFP.AUTOYIELD ile kombine ederek.
Ama işe yeramadı.

Bu davranış şeklin nedenini bilen veya tahmin eden varmı?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

2

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

VFP servis pack 'dan olabilir. Böyle saçmalıklar benim de başıma gelimişti.  Programı procedürlere ayırmayı dene o bölümde belki işe yarar.

3

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Mehmet,
Bence VFP ile zorlama.

Bunu C# ile ya da bilemedin C++ ile normal yapabiliyorsun, degil mi? O zaman VFP icin bir tane Activex ya da C++ ile unmanaged yapiyorsan FLL yaz bence.

Ya da, ne bileyim belki da sadece "data feed" gerekiyordur, C#, C++ ... ile yazdigin bir database'e data yazsin. VFP okusun.

4

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Daha evvel Vfp ile TCP uygulamasi yapmışdım. Sorun yaşamadım. Neden UDP ile sorun yaşıyorum anlıyamadım.
Biraz daha kurcalıyacam. Baktımki olmiyoru, Çetin Beyin önerisini gündeme alacam.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

5

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Mehmet; aslında cevabı kendin vermişsin smile

Suçlu : UDP. Yerine TCP/IP kullanmalısın

http://tr.wikipedia.org/wiki/UDP

"Gelişmiş bilgisayar ağlarında paket anahtarlı bilgisayar iletişiminde bir datagram modu oluşturabilmek için UDP protokolü yazılmıştır. Bu protokol minimum protokol mekanizmasıyla bir uygulama programından diğerine mesaj göndermek için bir prosedür içerir. Bu protokol 'transaction' yönlendirmelidir. Paketin teslim garantisini isteyen uygulamalar TCP protokolünü kullanır."

"UDP güvenilir olmayan bir aktarım protokolüdür. Ağ üzerinden paketi gönderir ama gidip gitmediğini takip etmez ve paketin yerine ulaşıp ulaşmayacağına onay verme yetkisi yoktur. UDP üzerinden güvenilir şekilde veri göndermek isteyen bir uygulama bunu kendi yöntemleriyle yapmak zorundadır."

Sevgiler

Mehmet K yazdı:

Daha evvel Vfp ile TCP uygulamasi yapmışdım. Sorun yaşamadım. Neden UDP ile sorun yaşıyorum anlıyamadım.
Biraz daha kurcalıyacam. Baktımki olmiyoru, Çetin Beyin önerisini gündeme alacam.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

6 Son düzenleyen, Mehmet K (07.05.2015 16:53:34)

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Uğur, bu üretiğim cihaz TCP'yi kaldıracak gücünde değil.

-------------------------

"Her kör tavuk arada bir bir buğday parcası bulur" düşüncesi ile kurcalamaya devam ettim.
Sonuç: kontrolü CLASS içinde değil, CLASS dışında yaptığımda, herhangi bir sorun yaşamiyorum.

Böyle çalışmiyor:

Visual Fox Pro
oCmd = CREATEOBJECT("Command", "192.168.1.22", 65123)

IF oCmd._Ping() == SUCCESS
    MESSAGEBOX("SUCCESS")
ELSE
    MESSAGEBOX("NO_SUCCESS")
ENDIF

Ama böyle şakır şakır çalışıyor:

Visual Fox Pro
oCmd = CREATEOBJECT("Command", "192.168.1.22", 65123)

oCmd._Ping(THISFORM)
 
nCnt = 0
DO WHILE nCnt < 5
    Sleep(10)   // 10ms
    IF !EMPTY(THISFORM.cBuf)
        EXIT
    ENDIF
    ncnt = ncnt +1
ENDDO
 
IF EMPTY(THISFORM.cBuf)
    MESSAGEBOX("NO SUCCESS sad")
ELSE
    MESSAGEBOX("SUCCESS! " + STR(nCnt))
ENDIF

Ve ncnt değişkenin değeri hep 0.

Ama bu tars programlama stili bana çok ters.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

7

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Mehmet ,
Benim yazdığım programın bütün kodları benim stilime ters. Bence dert etme işini çözüyorsa tamamdır.

8

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

Bu akşam birde CLASS'ı ikiye bölecem.
winsock için ayrı bir CLASS, tüm haberleşme için ayrı bir CLASS.  Bakalım kör tavuk ne tür bir performans sergiliyecek smile

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

9 Son düzenleyen, Mehmet K (08.05.2015 09:10:49)

Re: Winsok.DataArrival() sadece Debugger ile tetikleniyor

2 farklı CLASS ile olmadı. Aynı problem devam etti.
Ama şöyle problemi çözebildim: CLASS'ın içine 2 WinSock-Olecontrol koydum. Birisi send için, diğeri receive için. Şakır şakır çalışıyor. Ve böylece tüm haberleşme tek bir CLASS içinde derli toplu barındırabiliyorum.

\o/

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.