[gelöst] [C++ / DirectX9] boost:thread

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
D3DX
Beiträge: 36
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

[gelöst] [C++ / DirectX9] boost:thread

Beitrag von D3DX »

Hallo zusammen,
ich versuche momentan in meinem DirectX9 Programm den Befehl D3DXCreateTextureFromFileEx parallel zum Renderloop auszuführen.
Hierfür benutze ich den boost:thread.

Leider stürzt das Programm immer dann ab, wenn die Funktion, welche die Textur erstellen soll, über den Thread ausgeführt wird.
An der Funktion selbst kann es aber nicht liegen, da ich bereits versucht habe, diese Funktion in der Renderloop mittels der Taste F2 ausführen zu lassen.
Bestücke ich die Funktion mit anderen Befehlen, so klappt das ganze ohne Absturz. Der Fehler hat wohl die Ursache in D3DXCreateTextureFromFileEx.
Aber warum?


Hier sind ein paar Zeilen Code:

Funktion zum erstellen der Textur

Code: Alles auswählen

void loadTextureArray()
{
    D3DXIMAGE_INFO ImgInfo; 
    D3DXGetImageInfoFromFile("fantasy_cave.bmp", &ImgInfo); 

    m_pTexture2 = NULL;
    // Textur anlegen 
    hr = D3DXCreateTextureFromFileEx(geti(Device).d3d_9_device, 
                                "fantasy_cave.bmp", 
                                256, 
                                256, 
                                0,0, 
                                D3DFMT_UNKNOWN, 
                                D3DPOOL_MANAGED, 
                                D3DX_FILTER_NONE, 
                                D3DX_FILTER_NONE, 
                                RGB(255,0,255),0,0, 
                                &m_pTexture2); 

	if( FAILED(hr) )
	{
	}
	else
	{
	}
};
Hauptprogramm

Code: Alles auswählen

void startThread1();

// Boost Includes
#include <boost/thread.hpp>
.
.
.

// Version 1: Hiermit funktioniert der Aufruf nicht
boost::thread thread_(&startThread1);

while(Window.Update())
{
  RENDER_SCENE;
  .
  .
  // Version 2: Hiermit funktioniert der Aufruf
  if ( InputManager.Keyswitcher(DIK_F2, KEY_IMPULS_SINGLE) == true )
  {
      loadTextureArray();
  }
  .
  PRESENT_SCENE;
}

void startThread1()
{
  // Thread 1: Start
  loadTextureArray();
  // Thread 1: Ende
};

Die Zeile
boost::thread thread_(&startThread1);
wird natürlich auskommentiert, wenn Version 2 funktionerien soll.


Hat jemand eine Erklärung für diesen Absturz?
Die Textur wird übrigens 'noch' nicht im Programm verwendet...
Zuletzt geändert von D3DX am 17.10.2010, 15:37, insgesamt 1-mal geändert.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [C++ / DirectX9] boost:thread

Beitrag von Aramis »

Hast du beim Erstellen des Devices das D3DCREATE_MULTITHREADED-Flag angegeben?
D3DX
Beiträge: 36
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

Re: [C++ / DirectX9] boost:thread

Beitrag von D3DX »

Nein, das habe ich noch nicht.
Deine Antwort hört sich wirklich vielversprechend an. DANKE
Ich habe ja einige DX9 Bücher gelesen, aber über D3DCREATE_MULTITHREADED hat glaube ich noch keines geschrieben.

Muss man beim createdevice auf D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED prüfen, ob dieses möglich ist,
oder klappt multithreaded generell auf jedem PC?
D3DX
Beiträge: 36
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

Re: [C++ / DirectX9] boost:thread

Beitrag von D3DX »

So, nochmals Danke Aramis.
Du hast den richtigen Riecher gehabt, denn nun funktioniert mein Programm ohne abzustürzen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++ / DirectX9] boost:thread

Beitrag von Krishty »

D3DX hat geschrieben:Muss man beim createdevice auf D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED prüfen, ob dieses möglich ist,
oder klappt multithreaded generell auf jedem PC?
Multi-Threading ist überall verfügbar, auf Hardware-Vertexprocessing musst du erst testen indem du die GPU-Fähigkeiten per GetDeviceCaps() holst und gegen das VertexProcessingCaps-Member bzw. das DevCaps-Member mit D3DDEVCAPS_HWTRANSFORMANDLIGHT testest – ich kann aber keine Gewähr drauf geben; ist bei D3D9 alles ein wenig unübersichtlich.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Lynxeye »

Wobei ich mir speziell bei HARDWARE_VERTEXPROCESSING keine großen Gedanken machen würde. Das sollte auf jeder DX9 fähigen Grafikkarte verfügbar sein und bei denen, wo es das nicht ist (z.B. einige Intel IGPs) wird es transparent vom Treiber emuliert und kann trotzdem verwendet werden.

@TE: Bei allen anderen Flags ist ein Test ob es verfügbar ist aber auf jeden Fall sinnvoll. Google zu diesem Thema einfach mal nach "Direct X Device Enumeration".
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Krishty »

Lynxeye hat geschrieben:Wobei ich mir speziell bei HARDWARE_VERTEXPROCESSING keine großen Gedanken machen würde. Das sollte auf jeder DX9 fähigen Grafikkarte verfügbar sein und bei denen, wo es das nicht ist (z.B. einige Intel IGPs) wird es transparent vom Treiber emuliert und kann trotzdem verwendet werden.
Auf meinem Eee nicht :( Und auch, wenn das kein System zum Spielen ist, benutze ich es oft, um „zwischendurch“ entwickeln zu können. In diesem Fall kommt man einfach nicht drumherum.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Lynxeye »

Oh. Das ist auch für mich mal etwas neues. Vielen Dank für die Info. Damit nehme ich den Teil meines Posts ganz schnell wieder zurück.
D3DX
Beiträge: 36
Registriert: 17.10.2010, 14:06
Echter Name: Marco
Wohnort: 58119 Hagen (NRW)

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von D3DX »

Beim createdevice kontrolliere ich bereits, ob hardware, software erstellt werden kann bzw. soll.
Für den Fall, dass hardware möglich ist, verwende ich nun den multithreaded flag.
Das nehme ich dann halt als Vorraussetzung für mein Programm. Alles darunter würde sowieso zu langsam laufen.


Für diejenigen, die es noch interresiert...
Erklärung der Lösung, welche ich dann bei MSDN Microsoft fand:
Legen Sie die Flags D3DCREATE_MULTITHREADED und D3DCREATE_FPU_PRESERVE fest, damit kein von Direct3D9 verwendeter Speicher beschädigt wird und damit Direct3D9 keine FPU-Einstellungen ändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Krishty »

D3DX hat geschrieben:Für den Fall, dass hardware möglich ist, verwende ich nun den multithreaded flag.
Ich könnte mich irren, aber: Threading-Sicherheit ist doch eine Eigenschaft der Runtime, nicht der Hardware. Ergo muss man das Flag immer definieren, wenn man D3D mit mehr als einem Thread benutzt, oder?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Aramis »

Richtig.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Jörg »

@Lynxeye: Vor langer langer Zeit haben Intel-Karten mal einen HW-VS vorgegaukelt, auch wenn sie keinen hatten. Da das aber zu mehr Problemen als Nutzen gegenueber dem Software-Processing via Direct3D gefuehrt hat, wurde irgendwann aus dem 0x0200 ein 0x0000 :) Daher auch in ganz alten Empfehlungen die Hinweise, bei Intel-Grakas der 945?-Serie die VS-Version zu ignorieren.
@Krishty: Was steckt denn in deinem EeePC ? GMA500?
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [gelöst] [C++ / DirectX9] boost:thread

Beitrag von Krishty »

Jörg hat geschrieben:@Krishty: Was steckt denn in deinem EeePC ? GMA500?
Mobile Intel(R) 945 Express Chipset Family, auch mit dem von dir erwähnten Vertex-Shader-Model 0.0 :) Hach, die letzte Action war eine lustige Zeit.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten