Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Thread Opengl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.04.2010, 17:13 Uhr
Moritz1243



Hallo zusammen,

ich habe ein Problem oder einen Fehler mit meinen Thread in dem Texturen geladen werden. Mein Vorhaben war es mehrer Bilder darzustellen. Der Thread, der die dafür nötigen Bilder lädt wird aufgerufen, wenn das programm startet. Nach dem aufruf des Threads wird sofort mit dem rendern der noch nicht vorhanden bilder begonnen. Normaler weise müssten die bilder dann nach und nach geladen werden und somit immer mehr bilder auch gerendert werden. jedoch passiert dies nicht, sondern die bilder bleiben weiß.

Meine Frage ist nun warum kann der Thread die bilder nicht laden, während opengl rendert? Den wenn ich die Funktion zum laden der bilder, anstelle des threads direkt aufrufe stockt das programm zwar erst während der lade zeit, aber dann werden alle bilder angezeit.

Ich habe mal etwas gegoogelt und herrausgefunden das es eventuell an gemeinsamer resourcennutzung liegt und das man sowas mit einer critial section umgehen kann. Stimmt das?

im physdo code sieht das so aus:

so geht:


C++:
int main
{
erstellefenster();

loadbmp("...");
}



so nicht:


C++:
int main
{
erstellefenster();

_beginThread("loadthread", ...);
}

void loadthread
{
loadbmp{"..."};
}



danke

Dieser Post wurde am 23.04.2010 um 18:34 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.04.2010, 18:31 Uhr
ao

(Operator)


Ich kenne OpenGL nicht, aber gilt da vielleicht eine ähnliche Bedingung wie in .NET, dass Grafikelemente nur von dem Thread angesprochen werden können, der sie erzeugt hat? Und dass alle Worker-Threads, wenn sie irgendwas malen wollen, das per Invoke von dem GUI-Thread erledigen lassen müssen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.04.2010, 18:34 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
les dir das mal durch:

www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

evtl findest du dann den fehler in deinem code, so auf anhieb erkenn ich ihn nicht (da ich nicht weiß wie du das fenster erzeugst, wie du zeichnest, usw
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.04.2010, 19:50 Uhr
Moritz1243



Also im Code ist kein Fehler da bin ich mir ganz sicher, es funktioniert ja wenn es ohne thread macht. Ebenfalls werden alle informationenn richtig an den thread weitergegeben. Das Fenster wir so wie in diesem tutorial erstellt: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=46. Brauchst du noch mehr informationen für eine aussagt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.04.2010, 22:34 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab lange nichts mehr mit OpenGL gemacht, aber wenn sich daran nichts groß geändert hat, ist OpenGL eine state machine mit einem globalen Zustand für das gesamte Programm. Das bedeutet, wenn zwei Threads gleichzeitig OpenGL-Funktionalität benutzen wollen, schreiben sie beide gleichzeitig in diesem Zustand rum und kommen sich dabei fast zwangsläufig in die Haare.

Du könntest natürlich so mutexen, dass immer nur ein Thread OpenGL betreibt, aber wahrscheinlich ist es sinnvoller, den gesamten OpenGL-Kram in einem Thread zu machen und was immer sonst noch anfällt in einem anderen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.04.2010, 23:58 Uhr
~toxic
Gast


hi,
du musst von deinem thread aus eine funktion deiner view aufrufen (zumindest habe ich das mal so unter vc6 gemacht) ... also:

C++:
// ...
    AfxBeginThread( ThreadFunc, (LPVOID)this, THREAD_PRIORITY_NORMAL );
// ...

UINT CDeineView::ThreadFunc(LPVOID pParam)
{
    CDeineView* pParent = (CDeineView*)pParam;
    if ( pParent == NULL || !pParent->IsKindOf(RUNTIME_CLASS(CDeineView)) )
        return 1;
    pParent->ThreadFunc();
    return 0;
}

void CHelixClientView::ThreadFunc()
{
// hier deine bilder/grafiken laden
// ...
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.04.2010, 10:02 Uhr
~moritz1243
Gast


So ganz verstehe ich das noch nicht, ich habe keine Klassen erstellt von denen aus ich die Bilder laden. Was meinst du mit View? ... das scoupe? wäre nett wenn du mir das ganz mal ab der main zeigen könntest . Muss ich dafür noch irgendwas includieren?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.04.2010, 12:14 Uhr
Blubber2063



Teil den Context sollte immer nur ein Thread anfassen.
Also den Hook auf die Renderfunktionen nur einem Thread überlassen.
Und die Bilder über synchronisierte Funktionen setzen bzw. Zugriff darauf nehmen.



C++:
//Pseudocode
class View{

public:
  Image* getImage(); //Synchronized access to img
  void setImage(); //Synchronized access to img
private:
  Image* img;

};

void View::render(){
  if (getImage())
    img->render();
}



Dieser Post wurde am 24.04.2010 um 12:15 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: