Seite 1 von 1

Netzwerkfragen

Verfasst: 24.10.2014 15:10
von stevie1401
ich habe folgende Schleife:

Code: Alles auswählen

repeat
    Event = WaitWindowEvent()
    EventWindow = EventWindow()
    EventGadget = EventGadget()
    EventType = EventType()
    
    If ConnectionID<>0
      NetzwerkErgebnis = NetworkClientEvent(ConnectionID) ;ConnectionID ist der ClientSocket
    EndIf

until programmende
Ich habe das Gefühl, ich kann nur dann vom Server Daten empfangen, wenn ein Windows-Ereignis stattfand, wegen WaitWindowEvent().
(Ich muss immer die Maus bewegen, damit weitere Daten angezeigt werden)
Wartet das Programm dann solange, bis ein Windows-Ereignis stattfand und ignoriert ankommende Socket-Daten?

Wenn ja, wie kann ich das ändern?

Re: Netzwerkfragen

Verfasst: 24.10.2014 15:15
von RSBasic
Ja, um das Problem zu beheben:

Code: Alles auswählen

WaitWindowEvent(100)
Dann werden alle 100 Millisekunden überprüft, ob ein Event stattfand.

Re: Netzwerkfragen

Verfasst: 24.10.2014 16:11
von stevie1401
:allright:
Vielen Dank!

Re: Netzwerkfragen

Verfasst: 27.10.2014 10:40
von auser
RSBasic hat geschrieben: Dann werden alle 100 Millisekunden überprüft, ob ein Event stattfand.
Außer jemand schiebt das Fenster rum. Dann blockt WaitWindowEvent(100) und auch WindowEvent() so lange bis man das Fenster wieder loslässt. Darum sollte man evtl. von vorne herein überlegen ob so Dinge eine Problem darstellen und ob es nicht sinnvoller ist für das Netzwerk gleich von Anfang an einen eigenen Thread zu nehmen um unabhängig von den Fenstergeschichten zu werden. Dann tut man sich auch leichter wenn man mal eben einen MessageRequester aufpoppen lässt und der User dann erst mal eine Minute auf den Monitor starrt ehe er sich entscheidet ob er Ja oder Nein drücken soll (und in der Zeit natürlich der Server trotzdem weiter läuft).

Code: Alles auswählen

OpenWindow(0,0,0,320,200,"Verschieb mich bitte...")
Repeat
  Event = WaitWindowEvent(100)
  
  Debug(ElapsedMilliseconds())
  
;   If ConnectionID<>0
;     NetzwerkErgebnis = NetworkClientEvent(ConnectionID) ;ConnectionID ist der ClientSocket
;   EndIf  
Until Event = #PB_Event_CloseWindow 

Verfasst: 27.10.2014 11:38
von CodeCommander
~ DELETE ~

Re: Netzwerkfragen

Verfasst: 10.11.2014 20:18
von stevie1401
Ich würde das gerne ma mit #PB_Event_Timer und BindEvent() probieren.
Wie geht das genau?

Re: Netzwerkfragen

Verfasst: 10.11.2014 20:45
von ts-soft

Code: Alles auswählen

EnableExplicit

InitNetwork()

Global ConnectionID

Procedure TimerCallback()
  Protected NetzwerkErgebnis
  
  If EventTimer() = 1
    If ConnectionID <> 0
      NetzwerkErgebnis = NetworkClientEvent(ConnectionID) ;ConnectionID ist der ClientSocket
    EndIf
  EndIf
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")

AddWindowTimer(0, 1, 100)
BindEvent(#PB_Event_Timer, @TimerCallback())

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend

Re: Netzwerkfragen

Verfasst: 11.11.2014 00:02
von stevie1401
Vielen Dank :allright:

Re: Netzwerkfragen

Verfasst: 11.11.2014 13:52
von auser
Mit #PB_Event_Timer und BindEvent() blockt zwar dein Fenster nicht mehr den Netzwerk-teil dafür muss man dann aber halt wieder umgekehrt aufpassen daß nicht deine Netzwerk-funktionen dein Fenster blockieren. Darum denke ich daß Threads hier immer noch die beste Lösung sind wenn man das eine vom anderen unabhängig machen will.

Re: Netzwerkfragen

Verfasst: 11.11.2014 16:33
von HeX0R
Eigentlich ist es sogar die einzig wahre Lösung.
Es sei denn man bastelt nur einen Chat, wo mal alle paar Sekunden ein paar Bytes hin- und hergeschoben werden, da ist es relativ egal.

Sobald man größere Datenpakete versendet (und das Ganze evtl. sogar im GBit LAN), lässt sich das nur durch Threads ordentlich umsetzen.