OpenNetworkConnection ohne programmstop
OpenNetworkConnection ohne programmstop
gibt es irgendeine möglichkeit OpenNetworkConnection auszuführen ohne dass der programmcode stopt wenn der Server nicht existiert?
und eine möglichkeit zu überprüfen ob die verbindung zum server noch existiert wenn eine verbindung schon statrgefunden hat?
dies ist wichtig da ich 2 clienten in einen Programm hab und falls einer ausfällt muss ich noch daten zu den Clienten schicken können und der andre Client muss gleichzeit versuchen eine verbindung aufzubaun,
da diese beiden sachen wichtig sind brauch ich diese beinen oben genannten sachen!
Vielen Dank schon im vorraus!
und eine möglichkeit zu überprüfen ob die verbindung zum server noch existiert wenn eine verbindung schon statrgefunden hat?
dies ist wichtig da ich 2 clienten in einen Programm hab und falls einer ausfällt muss ich noch daten zu den Clienten schicken können und der andre Client muss gleichzeit versuchen eine verbindung aufzubaun,
da diese beiden sachen wichtig sind brauch ich diese beinen oben genannten sachen!
Vielen Dank schon im vorraus!
Re: OpenNetworkConnection ohne programmstop
da liegt mein problem ich hab von Threads keine ahnung....Sirhc.ITI hat geschrieben:Pack OpenNetworkConnection in einen Thread und prüfe danach mit IsThread() wan der Thread fertig ist. Den Rückgabewert kannst du ja über eine globale Variable oder besser noch mit einem pointer machen.
wäre echt nett wenn du mir da vl unter die arme greifen könntest!
und das mit dem ping werd ich machen aber da seh ich nur ein problem:
was wenn der server noch da ist aber ich nen neuen aufmach dann stürtzt doch das prog ab oder?
Das ganze ist sehr ausführlich und gut erklärt in der Hilfe zu finden (F1). Such einfach nach "Thread", bzw "CreateThread" und lass dich dann mit den Links durchs Thema führen.da liegt mein problem ich hab von Threads keine ahnung....
Platt kann man sagen, dass ein Thread parallel zu deinem Programm läuft. Solltest du zB eine Endlosschleife proggen (zB eine abfrage der Network Events) erstellst du einfach einen neuen Thread, der parallel laufend dein Programm nicht beeinflusst.
Procedure BeispielEndlosschleife()
...
Endprocedure
CreateThread(@BeispielEndlosschleife(), 0)
ACHTUNG:gnasen hat geschrieben:Procedure BeispielEndlosschleife()
...
Endprocedure
CreateThread(@BeispielEndlosschleife(), 0)
Code: Alles auswählen
Global Ende.l
Procedure BeispielEndlosschleife(dummy.l) ; <- es MUSS EIN parameter vorhanden sein
repeat
if ENDE
procedurereturn
endif
forever
Endprocedure
CreateThread(@BeispielEndlosschleife(), 0)
;blablabla code
; Bei Programmende:
Ende = 1 ; Variable Ende afu #True setzen damit sich der Thread sicher beendet
; Dann ggf mit ishread() noch kurz warten dun dann isset auch noch schön sicher beendet alles

- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Was meinst du damit? ... du drückst dich da sehr unglücklich aus.NicTheQuick hat geschrieben:Man muss einen Thread auch nicht unbedingt sicher beenden.
Ein Thread sollte immer "sauber" (sicher) beendet werden. Ob man
darauf warten will/ muss ist eine andere Sache.
Ach ja, der angesprochende Parameter muss immer vom Typ Long sein.
MFG PMV
Kann auch ein Pointer auf eine Struktur sein. Somit kann man einen Thread auch einen Poll von Daten übergeben.PMV hat geschrieben:NicTheQuick hat geschrieben: Ach ja, der angesprochende Parameter muss immer vom Typ Long sein.
MFG PMV
Nachtrag:
Jeden Client in ein eigenen Thread laufen lassen. Threadsafe erforderlich.
Mit Globaler Variable "ende" auf 1 werden die Threads beendet.
Hatte mit den Beispiel getestet ob man über mehrere Threads arbeiten kann:
Code: Alles auswählen
Global ende.l
InitNetwork()
Procedure MyThread(*this.s)
Protected ConnectionID, todo.l, len, t
Protected *buffer
; Warten auf Verbindung zum Server oder auf Abbruch
While ende = 0
ConnectionID = OpenNetworkConnection("localhost", 7000)
If ConnectionID <> 0
Break
EndIf
Delay(500)
Wend
If ende
If ConnectionID <> 0
CloseNetworkConnection(ConnectionID)
EndIf
ProcedureReturn 1
EndIf
; Speicher anfordern
*buffer = AllocateMemory($4000)
Repeat
Select NetworkClientEvent(ConnectionID)
Case #PB_NetworkEvent_Data
len = ReceiveNetworkData(ConnectionID, *buffer, $4000)
; Daten auswerten
Debug PeekS(*buffer, len)
Case #PB_NetworkEvent_File
Default
Select todo
Case 0:
Debug "New " + *this
SendNetworkString(ConnectionID, "NEW Test=100"+#CR$)
todo = 1
Case 2:
Debug "Get " + *this
SendNetworkString(ConnectionID, "GET "+*this+#CR$)
todo = 3
Case 4:
Debug "Pause" + *this
Delay(1000)
todo = 2
EndSelect
Delay(100)
t + 100
If t > 1000
todo + 1
t = 0
EndIf
EndSelect
Until ende
; Verbindung schliessen
CloseNetworkConnection(ConnectionID)
; Speicher freigeben
FreeMemory(*buffer)
EndProcedure
;- Konstanten
Enumeration ; Window ID
#Window
EndEnumeration
Enumeration ; Menu ID
#Menu
EndEnumeration
Enumeration ; MenuItem ID
#Menu_Exit
EndEnumeration
Enumeration ; Statusbar ID
#Statusbar
EndEnumeration
Enumeration ; Gadget ID
EndEnumeration
; ***************************************************************************************
;- Globale Variablen
Global exit = 0
;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
; Menu
If CreateMenu(#Menu, WindowID(#Window))
MenuTitle("&Datei")
MenuItem(#Menu_Exit, "Be&enden")
EndIf
; Statusbar
CreateStatusBar(#Statusbar, WindowID(#Window))
; Gadgets
If CreateGadgetList(WindowID(#Window))
EndIf
; Start Thread
hThread = CreateThread(@MyThread(),@"Test")
Delay(400)
hThread2 = CreateThread(@MyThread(),@"Value")
;-- Hauptschleife
Repeat
event = WaitWindowEvent()
window = EventWindow()
menu = EventMenu()
type = EventType()
Select event
Case #PB_Event_Menu ; ein Menü wurde ausgewählt
Select menu
Case #Menu_Exit
Exit = 1
ende = 1
EndSelect
Case #PB_Event_Gadget ; ein Gadget wurde gedrückt
Case #PB_Event_CloseWindow ; das Schließgadget vom Fenster wurde gedrückt
Exit = 1
Case #PB_Event_Repaint ; der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen)
Case #PB_Event_SizeWindow ; das Fenster wurde in der Größe verändert
Case #PB_Event_MoveWindow ; das Fenster wurde verschoben
Case #PB_Event_ActivateWindow ; das Fenster wurde aktiviert (hat den Fokus erhalten)
Case #PB_Event_SysTray ; das SysTray wurde aktiviert
EndSelect
Until Exit
EndIf
WaitThread(hThread)
WaitThread(hThread2)
Zuletzt geändert von mk-soft am 06.09.2007 03:27, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Wie viel Bytes hat den ein 32-Bit-Zeiger?mk-soft hat geschrieben:Kann auch ein Pointer auf eine Struktur sein. Somit kann man einen Thread auch einen Poll von Daten übergeben.PMV hat geschrieben: Ach ja, der angesprochende Parameter muss immer vom Typ Long sein.
MFG PMV

... aber bin mal gespannt, wie Fred das später in der 64-Bit version macht.

MFG PMV