warum wird Thread beendet ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

warum wird Thread beendet ?

Beitrag von True29 »

Hallo ,danke für eure hilfe.

ich erstelle vor meiner Hauptprogrammschleife einen thread.
diese soll dateien welche ich in eine globale liste hinzufüge downloaden.
ohne Thread hatte der download wunderbar geklappt.

Code: Alles auswählen

 Global ThreadID = CreateThread(@EXAMINE_DOWNLOAD(),0)

wärend der hauptschleife prüfe ich den status:

Code: Alles auswählen

 Debug IsThread(ThreadID)
und sehe das nach dem erstem download der thread beendet wird.

vielleicht hat hier jemand einen tip für mich.
danke.


hier mal noch die prozedur:

Code: Alles auswählen

Procedure EXAMINE_DOWNLOAD(a.i)  
  
  If ListSize(TotalDownloads()) = 0
    If ProgrammState = #Programm_preupdate
      ProgrammState = #programm_checkgamefiles
      Control_Hide(#CONTROL_TextCheckUpdate)      
    EndIf
    If ProgrammState = #programm_download
      ProgrammState = #programm_running
      Control_Hide(#CONTROL_TextCheckUpdate)      
      ;restore gui
      Control_HideGroup(#Control_GroupTempGravity,#False)
      Control_DisableGroup(#Control_GroupTempTitels,#False)
      Control_Hide(#CONTROL_Navileft,#False)
      Control_Hide(#CONTROL_Naviright,#False)
    EndIf
  Else            
    
    
    ;Files anzeigen                                            
    ;datei laden          
    ;neue datei
    
    If Not *http          
      NextElement(TotalDownloads())

      *http = 0 
      *http = HTTPQuery_New(TotalDownloads()\path+"/"+TotalDownloads()\name)
      
      If HTTPQuery_Open(*http)
        Protected statuscode.i = HTTPQuery_GetStatuscode(*http)
        
				; Check for valid statuscode
				If statuscode >= 200 And statuscode < 300
				  *buffer = AllocateMemory(#DOWNLOAD_BUFFER)
				  
				  CreateDirectory(TotalDownloads()\tpath)
				  
				  fp = CreateFile(#PB_Any, TotalDownloads()\tpath +"\"+  TotalDownloads()\name) 				  
				  
				  
				  If Not fp				    
				    Debug "file create error"
          
				  Else		
				    Debug "file create"
            TotalDownloads()\totalContentLength = HTTPQuery_GetTotalContentLength(*http)      
            TotalDownloads()\estimateStartTime = ElapsedMilliseconds()      
            TotalDownloads()\estimateStartBytes 	= 0            
          EndIf          
        Else          
          MessageRequester(#Gametitel,"error " + Str(statuscode) + " download von: " + TotalDownloads()\path+"/"+TotalDownloads()\name +" nicht möglich")          
          DeleteElement(TotalDownloads()) 
          
          HTTPQuery_Close(*http)
          HTTPQuery_Free(*http)              
          *http = 0 
          ProcedureReturn #True
        EndIf
        
      Else
       HTTPQuery_Close(*http)
       HTTPQuery_Free(*http)              
       *http = 0 
      EndIf          
    EndIf
        
    If *http         
      If *buffer                  
        If fp        

              temp = HTTPQuery_Read(*http, *buffer,#DOWNLOAD_BUFFER,#True)            
              WriteData(fp, *buffer, temp)                          
              SET_DOWNLOAD_PROGRESS(100*HTTPQuery_GetProgress(*http),TotalDownloads()\name,Round((FilesToDownload-ListSize(TotalDownloads()))/FilesToDownload,#PB_Round_Nearest))              
            Debug "download"
            ;Datei zu ende neues element
              If HTTPQuery_EOF(*http)               
                Debug "finish"
              CloseFile(fp)
               ; Connection terminated before we finished normally?
              If HTTPQuery_GetStatuscode(*http) < 0                              
              EndIf 
             
              HTTPQuery_Close(*http)
              HTTPQuery_Free(*http)              
              *http = 0                       
              DeleteElement(TotalDownloads())                    
            EndIf     
          Else
            
            MessageRequester(#Gametitel,"Failed To create file: "+ TotalDownloads()\path+ "\" +TotalDownloads()\name+"")
            ;programmstate = #wait
            ;StatusBarText(0,0,"Failed to create file!")      
          EndIf
        Else
         HTTPQuery_Close(*http)
         HTTPQuery_Free(*http)              
         *http = 0  
        EndIf
     EndIf               

 EndIf
EndProcedure
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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

Re: warum wird Thread beendet ?

Beitrag von NicTheQuick »

Ich sehe nirgendwo im Thread eine Schleife, die dafür sorgen würde, dass der Thread nicht beendet wird.
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: warum wird Thread beendet ?

Beitrag von ts-soft »

Und ein ProcedureReturn gibt es in einem Thread auch nicht.
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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: warum wird Thread beendet ?

Beitrag von GPI »

ts-soft hat geschrieben:Und ein ProcedureReturn gibt es in einem Thread auch nicht.
Kann man das nicht benutzen um den Thread zu beenden? Klar der Rückgabewert ist hinfällig, aber zurückspringen kann man damit imo.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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

Re: warum wird Thread beendet ?

Beitrag von NicTheQuick »

Klar, das geht.
Übrigens gibt es durchaus Rückgabewerte bei Threads. Allerdings kann man die nur mit einem Join() erfahren, das es bei Purebasic aber nicht gibt. Wäre eigentlich cool, wenn das implementiert werden würde.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: warum wird Thread beendet ?

Beitrag von True29 »

@NicTheQuick

ah danke.
is irgendwie logisch ;)

wird gleich behoben.
i7,12gb ram , Windows 10 ,Purebasic 5.50
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: warum wird Thread beendet ?

Beitrag von ts-soft »

GPI hat geschrieben:Kann man das nicht benutzen um den Thread zu beenden? Klar der Rückgabewert ist hinfällig, aber zurückspringen kann man damit imo.
Ich weiß jetzt nicht, ob der Rückgabewert jemals vom Stack wieder abgeholt wird. Ist aber auch egal, wenn ich von vornherein weiß, das hier ein Thread entsteht, sehe ich keine Schwierigkeit eine andere Abbruchbedingung zu nutzen, und wenn es nur wegem dem Stil ist :wink:
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
Antworten