Audgaben im NetworkClientEvent auslagern ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Audgaben im NetworkClientEvent auslagern ?

Beitrag von funkheld »

Hallo, guten Tag.
Muss man Aufgaben im NetworkClientEvent auslagern oder kann man die da drin abarbeiten?

Danke.
Gruss

Code: Alles auswählen

If status   
    cEvent = NetworkClientEvent(conID)
    
    Select cEvent      
      Case #PB_NetworkEvent_Data   
        
        FillMemory(DataBuffer, 1024)
        Result = ReceiveNetworkData(ConID, DataBuffer, 1024) 
        datatext=""
        
        For z=0 To result
          tt=PeekA(DataBuffer+z)
          
          If tt > 31 And tt < 128
            datatext=datatext+Chr(tt)
          EndIf
        Next 
        
        If test_1=1
          s_alti=StringField(datatext,2,":")
          s_apoa=StringField(datatext,3,":")
          s_peri=StringField(datatext,4,":")
          s_velo=StringField(datatext,5,":")
          
          SetGadgetText(#str_alti,s_alti)
          SetGadgetText(#str_apoa,s_apoa)
          SetGadgetText(#str_peri,s_peri)
          SetGadgetText(#str_velo,s_velo)
          
          If Val(s_alti) > Val("10000") And test_2=0
            SendNetworkString(conID,"LOCK THROTTLE To 0."+Chr(10)) 
            Delay(500)
            SendNetworkString(conID,"stage."+Chr(10)) 
            Delay(500)
            SendNetworkString(conID,"LOCK THROTTLE To 1."+Chr(10)) 
            test_2=1
          EndIf 
          If Val(s_alti) > Val("20000") And test_2=1
            SendNetworkString(conID,"LOCK THROTTLE To 0."+Chr(10)) 
            Delay(100)
            test_2=2
          EndIf 
          If Val(s_alti) > Val("30000") And test_2=2
            SendNetworkString(conID,"LOCK THROTTLE To 1."+Chr(10)) 
            Delay(100)
            test_2=3
          EndIf          
        EndIf
        
        If op=1 And test_1=1
          WriteStringN(#file, datatext)
        EndIf
    EndSelect      
  EndIf
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von STARGÅTE »

Ich werfe die Frage einfach mal zurück:

Kannst du es dir erlauben im NetworkClientEvent auf die Aufgabe zu warten?
Wenn die Antwort ja ist, also deutlich mehr Zeit zwischen zwei NetworkClientEvents liegt, als die Aufgaben in ihrer Ausführung benötigen, dann kannst du es so lassen.
Wenn die Antwort nein ist, dann musst die die Aufgaben nicht nur auslagern (nur eine Prozedur) sonden auch in einem ganz neuen Thread verarbeiten, damit die NetworkClientEvents ungehindert abgearbeitet werden können.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von funkheld »

Wenn die Zeit nicht ausreicht ?

Wie sähe bei mir jetzt eine Auslagerung bitte aus in einem Thread?
Wie sieht das Threadprogramm bitte aus in meinem Purebasicprogramm.

Danke.
Gruss
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von RSBasic »

Ich könnte zwar dein Code für dich umbauen (mache ich sonst immer gerne), aber du musst auch mal langsam nach über 8 Jahren lernen, wie du das selber herausfindest, indem du einfach die PB-Hilfe liest und die bereitgestellten Beispielcodes testest. Deshalb für dich: http://www.purearea.net/pb/german/manua ... index.html
Es ist nicht schwer. Es ist meiner Meinung nach gut dokumentiert. Das sollte auch für dich kein Problem sein. Wenn du das nicht lernst, dann wirst du immer Probleme damit haben und auf Hilfe anderer angewiesen sein.
Versuch es einfach mal selber. Wenn du nach deinen Versuchen immer noch nicht weiterkommst, dann kannst du gerne immer noch fragen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von funkheld »

Wieviel Threads kann man eigentlich anlegen ?

------------------------------------
thread1 = CreateThread(@auswerte1n(), *interval1)
ThreadPriority(thread1, 16)

thread2 = CreateThread(@auswerten2(), *interval2)
ThreadPriority(thread2, 16)

.........
.........
-------------------------------------
Danke.
Gruss
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von Sicro »

funkheld hat geschrieben:Wieviel Threads kann man eigentlich anlegen ?
Vermutlich mehr als du jemals brauchen wirst:

Code: Alles auswählen

Procedure Wait(Parameter)
  Repeat : Delay(10000) : ForEver
EndProcedure

Define.q ThreadsCounter

While CreateThread(@Wait(), 0)
  ThreadsCounter + 1
  Debug ThreadsCounter
Wend
Auskunft von einem Microsoft-Mitarbeiter:
Does Windows have a limit of 2000 threads per process?
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von funkheld »

Danke.

Ich habe einen Thread eingerichtet.
---------------------------
Procedure auswerten(*interval)
Repeat
Delay(5)
.....
.......
----------------------------

Wenn ich Delay dort rausnehme oder verkleinere bricht die Netzwerkverbindung zusammen.
Was kann man dort statt dieses Delay einbauen?

Danke.
Gruss

Code: Alles auswählen

Global Quit.l, Port.l, conID.l, status.l, cEvent.l, Result.l, EventID.l
Global text_e.s,op.l,z.l,datatext.s,tt.l,test_1.l,test_2.l,s_alti.s,s_apoa.s,s_peri.s,s_velo.s
Global anzahl.l, wert.l,hoehe.l

Declare auswerten(*interval) 

Enumeration
  #Window_0
  #b_ende
  #b_connect
  #b_disconnect
  #b_cls
  #b_start
  #b_edit
  #b_run
  #str_netzwerk
  #str_alti
  #str_apoa
  #str_peri
  #str_velo
  #edit
  #text_alti
  #text_apoa
  #text_peri
  #text_velo
EndEnumeration

thread = CreateThread(@auswerten(), *interval)
ThreadPriority(thread, 16)
;PauseThread(thread)

DataBuffer = AllocateMemory(1024)

OpenWindow( #Window_0, 10, 10, 400, 500, "kos_gadget", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
AddWindowTimer(#Window_0, 123, 500)

ButtonGadget(#b_ende,10, 10,100, 20, "Ende")
ButtonGadget(#b_connect,120, 10, 100, 20, "Connect")
ButtonGadget(#b_disconnect,120, 30, 100, 20, "Disconnect")
ButtonGadget(#b_cls,280,200, 80, 25, "Cls")
ButtonGadget(#b_start,280,260, 80, 25, "Start")
ButtonGadget(#b_edit,280,225, 80, 25, "Sende Edit")
ButtonGadget(#b_run,280,285, 80, 25, "Sende Run")

StringGadget(#str_netzwerk,230, 10, 120, 22, "")

StringGadget(#str_alti,10, 80, 140, 22, "")
StringGadget(#str_apoa,10, 105, 140, 22, "")
StringGadget(#str_peri,10, 130, 140, 22, "")
StringGadget(#str_velo,10, 155, 140, 22, "")

TextGadget(#text_alti, 160,85, 200, 20, "ALTITUDE")
TextGadget(#text_apoa, 160,110, 200, 20, "APOAPSIS")
TextGadget(#text_peri, 160,135, 200, 20, "PERIAPSIS")
TextGadget(#text_velo, 160,160, 200, 20, "VELOCITY m/s")

EditorGadget(#edit, 10,200, 250, 250)

Quit = 0
Port = 5411
status = 0
test_1=0
test_2=0

InitNetwork()
Repeat  
  EventID =  WaitWindowEvent(5)
  
  If EventID = #PB_Event_Timer And EventTimer() = 123 And status=1 
    SendNetworkString(conID,"run kosdaten(1)."+Chr(10)) 
  EndIf  
  
  Select EventID
    Case #PB_Event_CloseWindow
      Quit = 1
      
    Case #PB_Event_Gadget 
      Select EventGadget()    
        Case #b_ende            
          Quit = 1
          
        Case #b_connect        
          If Not status
            conID = OpenNetworkConnection("127.0.0.1", Port,#PB_Network_TCP,2000)
            If conID
              status = 1
              SetGadgetText(#str_netzwerk,"Connected" + #CR$)
            EndIf
          EndIf
          
        Case #b_disconnect
          If status <> 0
            CloseNetworkConnection(conID)
            status = 0
            SetGadgetText(#str_netzwerk,"Connection closed" + #CR$)
          EndIf 
          
        Case #b_cls
          text_e=""
          SetGadgetText(#edit, text_e)   
          
        Case #b_start
          If status=1
            SendNetworkString(conID, "1"+Chr(10))  
            Delay(100)
            SendNetworkString(conID, "switch to 0."+Chr(10))  
            Delay(100)
          EndIf
          
        Case #b_run
          If status=1
            SendNetworkString(conID,"run kosdaten(1)."+Chr(10)) 
          EndIf
          
        Case #b_edit
          If status=1
            anzahl = CountGadgetItems(#edit)
            For wert =0 To anzahl
              text_e=GetGadgetItemText(#edit,wert) 
              SendNetworkString(conID,text_e+Chr(10))
              Delay(100)
            Next
          EndIf 
      EndSelect
  EndSelect
  
  If status   
    cEvent = NetworkClientEvent(conID)   
    Select cEvent     
      Case #PB_NetworkEvent_Data   
        test_1=1  
        datatext=""      
        FillMemory(DataBuffer, 1024)
        
        Result = ReceiveNetworkData(ConID, DataBuffer, 1024) 
        
        For z=0 To result
          tt=PeekA(DataBuffer+z)
          
          If tt > 31 And tt < 128
            datatext=datatext+Chr(tt)
          EndIf
        Next 
    EndSelect 
  EndIf
 
Until Quit = 1 Or EventID = #PB_Event_CloseWindow

FreeMemory(DataBuffer)
End

Procedure auswerten(*interval)  
  Repeat
    Delay(5)
    If test_1=1
      s_alti=StringField(datatext,2,":")
      s_apoa=StringField(datatext,3,":")
      s_peri=StringField(datatext,4,":")
      s_velo=StringField(datatext,5,":")
      
      SetGadgetText(#str_alti,s_alti)
      SetGadgetText(#str_apoa,s_apoa)
      SetGadgetText(#str_peri,s_peri)
      SetGadgetText(#str_velo,s_velo)
      
      hoehe= Val(s_alti)
      If hoehe > 10000 And test_2=0
        SendNetworkString(conID,"LOCK THROTTLE To 0."+Chr(10)) 
        Delay(500)
        SendNetworkString(conID,"stage."+Chr(10)) 
        Delay(500)
        SendNetworkString(conID,"LOCK THROTTLE To 1."+Chr(10)) 
        test_2=1
      EndIf 
      If hoehe > 20000 And test_2=1
        SendNetworkString(conID,"LOCK THROTTLE To 0."+Chr(10)) 
        Delay(100)
        test_2=2
      EndIf 
      If hoehe > 30000 And test_2=2
        SendNetworkString(conID,"LOCK THROTTLE To 1."+Chr(10)) 
        Delay(100)
        test_2=3
      EndIf 
      test_1=0
    EndIf
  ForEver
EndProcedure
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von xdes »

hi,(evlt hilfst)
ich vermute du suchst eine alternative die keine pause macht zum delay....

die fehlt mir grad nicht ein außer weglassen

ich vermute aber das deine Probleme durch das schreiben in einer variable von mehrer Zugriffspunkten aus entsteht...
Stichwort: Mutex

hast du schon mal geschaut was genau dein Netzwerk killt ?(manche Netzwerkkarten haben auch ein maximalen Event per time x da sie manchen nur zwischen speichern und langsamer abarbeiten)

@funkheld in Bezug auf die Threads ... sie sind primär von der Hardware abhängig (aus meiner Sicht) meistens wird denke ich nicht das maximale genutzt (ich glaube ich war mal bei einem fehlerhaften Script bei c.a. 500.000 laut Ressourcen Monitor für eine exe bei mir ... da habe ich dann aber auch schon das Script gekillt gehabt weswegen die zahl nicht genau zunehmen ist...)
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von funkheld »

Die : test_1=0 wird vom Thread und vom Client test_1=1 benutzt.
Wie kann ich das jetzt bitte mit Mutex beseitigen ?

Danke.
Gruss
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: Audgaben im NetworkClientEvent auslagern ?

Beitrag von xdes »

mit CreateMutex() erstellen


dann mit LockMutex() sperren
dann variable benutzen
und UnlockMutex() wieder freigeben
andere Code ausführen....
z.b. wenn ein der mutex definiert wurde...

Code: Alles auswählen

LockMutex(qq)
 test_1=0
UnlockMutex(qq)


vorsicht Code nicht getestet nur ein einfaches beispiel...

vorsicht dabei wird LockMutex() auch das warten ausgeführt bis es wieder freigeben wird.... sonst kannst du auch TryLockMutex() versuchen musst denn aber dann auch auswerten ...

ps: aber ganz wichtig erstmal versuchen was genau da tilt heraus zu bekommen... denn es kann halt auch was anderes sein .... hast du evtl ein Server Script(zum testen und den Fehler selber nach zu produzieren )...?(mir ist grade eingefallen es kann auch an Sicherheitsparametern ... liegen ...)
Antworten