Netzwerkfragen

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Netzwerkfragen

Beitrag 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?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Netzwerkfragen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Netzwerkfragen

Beitrag von stevie1401 »

:allright:
Vielen Dank!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: Netzwerkfragen

Beitrag 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 
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

~ DELETE ~
Zuletzt geändert von CodeCommander am 18.01.2015 14:37, insgesamt 1-mal geändert.
~ DELETE ~
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Netzwerkfragen

Beitrag von stevie1401 »

Ich würde das gerne ma mit #PB_Event_Timer und BindEvent() probieren.
Wie geht das genau?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Netzwerkfragen

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Netzwerkfragen

Beitrag von stevie1401 »

Vielen Dank :allright:
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: Netzwerkfragen

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Netzwerkfragen

Beitrag 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.
Antworten