OpenNetworkConnection ohne programmstop

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

OpenNetworkConnection ohne programmstop

Beitrag von R4z0r1989 »

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!
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Re: OpenNetworkConnection ohne programmstop

Beitrag von R4z0r1989 »

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.
da liegt mein problem ich hab von Threads keine ahnung....
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?
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

da liegt mein problem ich hab von Threads keine ahnung....
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.

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)
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

gnasen hat geschrieben:Procedure BeispielEndlosschleife()
...
Endprocedure

CreateThread(@BeispielEndlosschleife(), 0)
ACHTUNG:

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
Dann noch unter Projektoptionen: Threadsafe anklicken und fertig ;)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Procedure BeispielEndlosschleife(dummy.l) ; <- es MUSS EIN parameter vorhanden sein
Ich bin mir ziemlich sicher, dass das auch ohne ging. Aber ich lass mich auch gerne etwas besseren belehren ;)
Benutzeravatar
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

Beitrag von NicTheQuick »

Man muss einen Thread auch nicht unbedingt sicher beenden. Außer es
müssen Sachen freigegeben werden oder dergleichen. In dem Fall kann man
dann mit 'WaitThread()' auf das Ende des Threads warten.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

NicTheQuick hat geschrieben:Man muss einen Thread auch nicht unbedingt sicher beenden.
Was meinst du damit? ... du drückst dich da sehr unglücklich aus.

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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

PMV hat geschrieben:
NicTheQuick hat geschrieben: 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.

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
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

mk-soft hat geschrieben:
PMV hat geschrieben: 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.
Wie viel Bytes hat den ein 32-Bit-Zeiger? :D
... aber bin mal gespannt, wie Fred das später in der 64-Bit version macht.
<)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Sind LONGs unter 64bit Systemen nicht auch 64 Bit lang (also ein normaler Parameter bei übergaben dann immer ein 64 bit para?) bin mir net sicher...
Antworten