Aktuelle Zeit: 15.12.2019 18:18

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 07:16 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
Hallo Sommertv,

ich würde dein Beispiel in etwa so gestalten:
Code:
Structure VideoConvert
   FileName$
   EndFlag$
   OKFlag.i
   thread.i
EndStructure

Procedure MyThread(*Parameters.VideoConvert)
   Debug *Parameters\FileName$
   Debug *Parameters\EndFlag$
   Delay(2000)
   ; hier der Aufruf von ffmpeg mit RunProgram...
   *Parameters\OKFlag=1
EndProcedure

Define Parameters.videoConvert,Ende
Parameters\FileName$ = "blablabla.mov"
Parameters\EndFlag$ = "0"
Parameters\thread=CreateThread(@Mythread(),@Parameters)   
Repeat
   If Parameters\OKFlag=1
      Debug "Video ist fertig OKFflag="+Str(Parameters\OKFlag)
      Ende=1
   EndIf     
Until Ende=1


oder gleich als Procedure
Code:
EnableExplicit
Structure VideoConvert
   FileName$
   EndFlag.i
   OKFlag.i
   thread.i
EndStructure
Define Parameters.videoConvert,Ende,Video

Procedure MyThread(*Parameters.VideoConvert)
   Debug *Parameters\FileName$
   ;Debug *Parameters\EndFlag
   Delay(2000)
   ; hier der Aufruf von ffmpeg mit RunProgram...
   *Parameters\OKFlag=1
   *Parameters\EndFlag+1
EndProcedure
Procedure StartThread(*this.videoConvert,Video.s)
   With *this
      \FileName$=Video
      \OKFlag=#False
      \thread=CreateThread(@Mythread(),*this)   
   EndWith   
EndProcedure   


StartThread(Parameters,"Mein Video.mpg")
Repeat
   If Parameters\OKFlag=1
      Debug "Video ist fertig OKFflag="+Str(Parameters\OKFlag)   
      StartThread(Parameters,"Mein neues Video.mpg")
      If Parameters\EndFlag=2 : Ende=1 : EndIf
   EndIf     
Until Ende=1

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 16:45 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
Danke,
ich werds durcharbeiten...

_________________
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 17:13 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
@silbersurfer:
Das ist aber genau die Art und Weise wie man es eben nicht tun soll. Busy Waits sind die falsche Herangehensweise.

_________________
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 17:34 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@NicTheQuick
Zitat:
Das ist aber genau die Art und Weise wie man es eben nicht tun soll.


wie meinst du das NicTheQuick mit
Zitat:
Busy Waits sind die falsche Herangehensweise

kannst du mir das mal genauer erklären, bin da jetzt etwas auf dem Holzweg

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 18:04 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
"Busy wait" bedeutet, dass du in einer Schleife durchgehend prüfst, ob der Thread das Flag gesetzt hat. Das belastet die CPU unnötig und vernachlässigt deswegen andere Prozesse. Besser ist die Herangehensweise mit PostEvent aus dem Thread heraus oder wenn man gar keine Ereignisschleife nutzt, dann macht man es normalerweise mit Condition Variables oder zumindest Semaphoren. Leider bietet Purebasic nur Semaphoren nativ an.

Mk-softs Mini Thread Control ist effizienter und auch sicherer zu nutzen.

Das ist jetzt nicht böse gemeint, aber bei Threads muss man unheimlich aufpassen. Die falsche Sperrreihenfolge, falsches Signaling, doppeltes Sperren oder Entsperren, eine einzelne ungeschützte Zeile, ... Alles kann dazu führen, dass die meiste Zeit alles richtig läuft, aber es in ganz seltenen Fällen zu Fehlern kommt. Und einfach reproduzierbar sind die meistens nicht, weil es oft mit dem Scheduling des Betriebssystems zusammenhängt oder sogar damit, ob der Nutzer einen SingleCore oder MultiCore hat. Das kann am Ende schon ganz schön verrückt werden. :D Aber wie auch immer, wichtig ist einfach, dass man grundlegende Prinzipien verstanden hat und sie durchgehend anwendet.

_________________
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Variable an einen Thread übergeben und wenn fertig abfra
BeitragVerfasst: 14.07.2019 19:19 
Offline
Benutzeravatar

Registriert: 06.07.2014 12:21
@NicTheQuick
Zitat:
dass du in einer Schleife durchgehend prüfst

jetzt habe ich das verstanden, danke erstmal. Ich selber mach das auch mit Postevent
Nur bei seinen Beispiel war keine Gui eingebunden, weshalb ich das so veranschaulicht habe. Aber du hast natürlich Recht das man bei Thread sehr aufpassen muß was man wie dort übergibt oder abfragt.
Und natürlich bin ich dir nicht böse, ist doch alles zum zwecke des lernen hier.

Code:
EnableExplicit

Enumeration Window
   #VideoConverter
   #Textausgabe
   #button
EndEnumeration   
Enumeration #PB_Event_FirstCustomValue
   #Datei_Fertig
EndEnumeration   

Structure VideoConvert
   FileName$
   EndFlag.i
   OKFlag.i
   thread.i
EndStructure
Define Parameters.videoConvert,Ende,Video,Event,zahl

Procedure MyThread(*Parameters.VideoConvert)
   Debug *Parameters\FileName$
   Delay(2000)
   ; hier der Aufruf von ffmpeg mit RunProgram...
   *Parameters\OKFlag=1 ;Wenn RunProgram fertig ist Setze #true
   If *Parameters\OKFlag=1 : PostEvent(#Datei_Fertig,#VideoConverter,0) : EndIf
EndProcedure
Procedure StartThread(*this.videoConvert,Video.s)
   SetGadgetText(#Textausgabe,"Video ist in Bearbeitung !")
   With *this
      \FileName$=Video
      \OKFlag=#False
      \thread=CreateThread(@Mythread(),*this)   
   EndWith   
EndProcedure   
If OpenWindow(#VideoConverter, 0, 0, 400, 200, "VideoConverter",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   TextGadget(#Textausgabe,10,10,380,40,"")
   ButtonGadget(#button,300,170,90,20,"Datei Senden")
EndIf
Repeat
   Event=WaitWindowEvent()
   Select event    
      Case #Datei_Fertig   
         SetGadgetText(#Textausgabe,Parameters\FileName$+" ist Fertig")
         ;ab hier kann man entscheiden wie es weiter geht z.b
      Case #PB_Event_Gadget   
         Select EventGadget()
            Case #button
               If Not IsThread(Parameters\thread)
                  zahl+1   
                  StartThread(Parameters,"Mein Video"+Str(zahl)+".mpg")
               Else
                  SetGadgetText(#Textausgabe,"Video ist noch nicht Fertig")
               EndIf    
         EndSelect
      Case  #PB_Event_CloseWindow
         Ende=#True
   EndSelect      
Until Ende=#True

_________________
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye