Aktuelle Zeit: 13.08.2020 11:22

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: CreateThread
BeitragVerfasst: 05.08.2019 11:44 
Offline
Benutzeravatar

Registriert: 08.03.2010 22:12
Wohnort: AT
Guten Tag,
ich verstehe offensichtlich nicht wie und warum es zu dem Problem kommt:
ich versuche die Displayausgabe vom Rest des Programmes zu entkoppeln.

Warum? ich will das mal probieren. Aktuell arbeitet meine Engine unabhängig von der Displayrefreshrate, was ja so sein soll.
Aber, ich wollte probieren ob ich die Bildschirmausgabe als eigenen Thread verwenden kann.
Würde mich freuen, wenn einer dazu eine Idee hätte.

(PB Version 5.70LTS)

nun das Problem:
a) wenn ich einen Thread mit "repeat…...Code.....Code...forever" erstelle gibt es keine Bildschirmausgabe.
b) wenn ich einen Thread mit "...code...code ....code" erstelle (dieser wird in der mainschleife immer neu gestartet) funktioniert es, aber da wird ja jedesmal der thread neu gestartet.

Beispielcode:
ohne Repeat ...forever:
mainschleife:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Code:
 Repeat
   
   If e_actuall_world.s<>e_next_world.s;check if we in a new room/area
     CHANGE_ROOM(e_next_world.s)
     E_SOUND_BASE()  ;......basic routine for soundplayback....   ;here we start/change the global world sound
   EndIf
   
   If e_screen_type.b=#ENGINE_WINDOWED_SCREEN
     v_message.l=WaitWindowEvent(1) ;mouse an window events, we do not use these, but we have to catch the value to prevent programcrash if mouse or other window input event happen
   EndIf
   
   E_KEYBOARD_BASE()

   ;-------------------------- do some  thread work.....---------------------------
   If e_engine_multi_core.b=#True
     If e_engine_display_status.i=#E_ENGINE_DISPLAY_READY
       E_START_THREAD_GLOBAL()  ;try some threads?
     EndIf
     
  EndIf 
;--------------------------------------------------------------------------------------


   E_SHOW_PLAY_FIELD()               ;here we handle all screen/window resolution and display output situations
   ForEver

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Thread erstellende Routine:

Code:
;***************************************************************************************************************************

Procedure E_START_THREAD_GLOBAL()  ;------------------------- diese wird aus der Mainschleife aufgerufen
    If Not IsThread(e_thread_id_display_output.i)
    e_thread_id_display_output.i= CreateThread(@E_T_DRAW_FINAL_RENDER(),e_engine_display_status.i)
  EndIf
  If IsThread(e_thread_id_display_output.i) 
    WaitThread(e_thread_id_display_output.i);wird bei "repeat...forever" nicht verwendet.
  EndIf;
 EndProcedure

;****************************************************************************************************************************


;****************************************************************************************************************************
Procedure E_T_DRAW_FINAL_RENDER(my_display_port.i)  ;my_display_port.i wert wird von der Zeichenroutine übergeben.
 
  Define _frame_buffer_id.l=0
 

    If my_display_port.i=#E_ENGINE_DISPLAY_READY

    _frame_buffer_id=GrabSprite(#PB_Any,0,0, v_screen_w.f, v_screen_h.f)
   
    If  e_show_debug.b=#False
      ClearScreen(_REFRESH_COLOR) ;(black) delete origin screen       ;we use fullscreen only now
    Else
      ClearScreen(_RGB_DEBUG)  ;red
    EndIf
   
    If _frame_buffer_id<>0
      ZoomSprite(_frame_buffer_id,v_win_max_width.f, e_game_screen_height.f)
      DisplaySprite(_frame_buffer_id,0,e_screen_v_center.f)   
     
      If e_show_debug=#True
       E_TEXT_OUTPUT_("",#ENGINE_TEXT_IS_TRANSPARENT) ;debugging output, standard text
     EndIf
     
      FlipBuffers()
      FreeSprite(_frame_buffer_id)
      EndIf
   
    Else
     
      If _frame_buffer_id.l<>0
      FreeSprite(_frame_buffer_id.l) 
      EndIf

  EndIf
 
EndProcedure
;*****************************************************************************************************************************************



und hier mit "repeat ...forever" damit gibt es keine Bildschirmausgabe, my_display_port.i wird nicht verwendet.die debugausgabe wird nicht verwendet.

Code:
;****************************************************************************************************************************
Procedure E_T_DRAW_FINAL_RENDER(my_display_port.i)  ;my_display_port.i wert wird von der Zeichenroutine übergeben.
 
  Define _frame_buffer_id.l=0
 
Repeat

    _frame_buffer_id=GrabSprite(#PB_Any,0,0, v_screen_w.f, v_screen_h.f)
   
    If  e_show_debug.b=#False
      ClearScreen(_REFRESH_COLOR) ;(black) delete origin screen       ;we use fullscreen only now
    Else
      ClearScreen(_RGB_DEBUG)  ;red
    EndIf
   
    If isSprite(_frame_buffer_id)

      ZoomSprite(_frame_buffer_id,v_win_max_width.f, e_game_screen_height.f)
      DisplaySprite(_frame_buffer_id,0,e_screen_v_center.f)   
     
     ; If e_show_debug=#True
      ; E_TEXT_OUTPUT_("",#ENGINE_TEXT_IS_TRANSPARENT) ;debugging output, standard text
     ;EndIf
     
      FlipBuffers()
      FreeSprite(_frame_buffer_id)
      EndIf

ForEver

EndProcedure


__________________________________________________
Code-Tags hinzugefügt
05.08.2019
RSBasic


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateThread
BeitragVerfasst: 05.08.2019 11:55 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Also vorab erst mal:
In der Hilfe steht eindeutig:
Zitat:
Hinweis: Benutzen Sie innerhalb von Threads kein DirectX (MS Windows Einschränkung)! Wenn Sie auf Grafikdarstellung in Threads angewiesen sind, verwenden Sie stattdessen Images und 2DDrawing.
Somit würde ich vom Auslagern der ganzen Grafik-Sachen abraten.

Der erste Code (ohne Schleife) funktioniert vermutlich nur, weil der Thread und das Main-Programm nacheinander laufen (also also garkeine parallere Abarbeitung gibt, weil du ja auf den Thread wartest).
Der zweite Code geht deswegen nicht, weil wie in der Hilfe geschrieben, DirectX nicht in Threads arbeitet.

Wenn, dann sollte also die Grafikausgabe in der Main laufen, und den anderen Kram könntest du auslagern.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateThread
BeitragVerfasst: 05.08.2019 12:53 
Offline
Benutzeravatar

Registriert: 08.03.2010 22:12
Wohnort: AT
danke für die schnelle Antwort.
diesen Punkt muss ich in der Hilfe übersehen haben, danke nochmals.

LG.


an RSBasic: Danke für die Nachbearbeitung :allright:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 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