Kurzes Delay() für Netzwerk und Thread?

Für allgemeine Fragen zur Programmierung mit PureBasic.
DePe
Beiträge: 156
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Kurzes Delay() für Netzwerk und Thread?

Beitrag von DePe »

Ich empfange Daten über das Netzwerk in einem Thread. Wenn ich im Ereignis #PB_NetworkEvent_None von NetworkClientEvent(#) ein Delay(1) einfüge, dauert die Übertragung doppelt solange. Ohne Delay() oder mit Delay(0) wird die CPU, bw. ein Kern voll ausgelastet und die Übertragung ist doppelt so schnell.

Eine andere Software ist gleich schnell, aber lastet die CPU nicht aus, es sind nur ~ 5 %.

Ich habe schon einiges probiert, z.B. mit ZwDelayExecution() und timeBegin/EndPeriod(). Aber sobald ich irgendein 'Delay' verwende ist die Übertragung langsamer. Ohne Delay zähle ich so zwischen 0 und 900 Schleifendurchläufe im Ereignis #PB_NetworkEvent_None bis wieder Daten vorhanden sind. Die CPU ist ein langsamer Celeron J1900 mit 1,3 GHz. Ich vermute eine schnelle CPU verheizt dann die Leerlaufzeit noch besser :-)

Gibt es da eine bessere Möglichkeit für die Wartezeit beim Empfang? Oder funktioniert das nur, wenn man nicht die PureBasic Netzwerkfunktionen verwendet?

Konkret geht es um Messgeräte, wie Oszilloskope. Mit dem Programm in der Version 0.2.0.x habe ich das Problem:
http://peter.dreisiebner.at/messinstrumente/
Man kann damit im Moment nur SCPI-Kommandos senden.

Peter

Edit:
Das Problem ist eigentlich nur eines. wenn viele kleine Datenpakete empfangen werden, z.B. 3 MB in 1 KB Paketen.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von mk-soft »

Überprüfe mal ob die CPU überhaupt ein schnelles Delay unterstützt.

Code: Alles auswählen

Case #PB_NetworkEvent_None
          Delay(1)
          i + 1
          If i > 1000
            Debug ElapsedMilliseconds() - i_t
            i_t = ElapsedMilliseconds()
            i = 0
          EndIf
P.S.
5% Auslastung finde ich schon sehr hoch
Versuch mal dieses

Code: Alles auswählen

Case #PB_NetworkEvent_None
          i + 1
          If i >= 1000
            i = 0
            Delay(10)
          EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
DePe
Beiträge: 156
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von DePe »

Also beim ersten Code bekomme ich keine Ausgaben. Da ist das Delay(1) so lang, dass der Zähler die 1000 nie ereicht, bzw. die Antwort vom Gerät früher kommt. Die Übertragung dauert wieder doppelt so lange, die CPU-Belastung ist dafür Null.

Beim zweiten Code wird das Delay(10) so achtmal ausgeführt, danach geht es ohne Delay-Unterbrechung weiter. Da wird am Anfang auf die Antwort vom Gerät gewartet. Die Übertragung ist schnell, die CPU-Belastung dafür wieder hoch.

Die 5 % von dem anderen Programm sind eigentlich die Grundbelastung von meinem PC. Ich schaue nur im Taskmanager nach, so 3 bis 4 % sind immer da.

Peter
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von mk-soft »

Falscher Wert, zu hoch

Code: Alles auswählen

Case #PB_NetworkEvent_None
          i + 1
          If i >= 100 ; <- Hier wert suchen der passt 
            i = 0
            Delay(10)
          EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von helpy »

Da wünscht man sich eine WaitNetworkEvent-Funktion:

Code: Alles auswählen

WaitNetworkServerEvent([#Server [, Timeout]])
... und für den Client:

Code: Alles auswählen

WaitNetworkClientEvent(Connection [, Timeout])
Windows 10
PB Last Final / (Sometimes testing Beta versions)
DePe
Beiträge: 156
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von DePe »

Das mit der Schleife und Zähler funktioniert nicht wirklich. Entweder bleibt die CPU-Belastung hoch, oder ich bremse die Verbindung damit aus. Ich kompiliere auch immer und verwende OutputDebugString_() für Messungen.
Und ich vermute ein schneller PC wartet dann sogar öfters, da er die Schleife ja schneller abarbeitet, und so vielleicht öfters als nötig wartet. Und in der Zeit wo gewartet wird, obwohl schon wieder Daten vorhanden sind, sendet das Gerät auch nicht weiter. Das wartet auf eine Anfrage bis es die nächsten Daten sendet.
Ich verwende jetzt wieder Delay(0), vielleicht finde ich einmal eine andere Lösung.

Peter
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Kurzes Delay() für Netzwerk und Thread?

Beitrag von tft »

Hallo,

schau mal hier http://forums.purebasic.com/english/vie ... 13&t=20964,
und https://docs.microsoft.com/de-de/window ... out-timers.

es gibt einen High resulution Counter. Aber nicht jedes Board unterstützt das.

Code: Alles auswählen

Procedure.l TicksHQ()
  Static maxfreq.q
  Protected t.q
  If maxfreq=0
    QueryPerformanceFrequency_(@maxfreq)
    maxfreq=maxfreq/1000
  EndIf
  QueryPerformanceCounter_(@t.q)
  ProcedureReturn t/maxfreq
EndProcedure

Code: Alles auswählen

t=TicksHQ()
Repeat
  t2=TicksHQ
  If t2-t
    ; a millisecond has passed
    ; do some stuff
    t=t2
  EndIf
Until PureBasic 4.0 is released
Habe ich aus meinem Proc Pool entnommen und nicht Aktuell getestet.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten