Seite 1 von 2

Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 20:17
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

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 21:10
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.

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 21:54
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

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 22:18
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.

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 22:28
von funkheld
Wieviel Threads kann man eigentlich anlegen ?

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

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

.........
.........
-------------------------------------
Danke.
Gruss

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 01.03.2018 23:53
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?

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 02.03.2018 09:59
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

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 02.03.2018 20:59
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...)

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 03.03.2018 13:55
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

Re: Audgaben im NetworkClientEvent auslagern ?

Verfasst: 03.03.2018 14:47
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 ...)