Gast
2005-09-11, 23:09:22
Hallo,
Ich arbeite z.Z. an einem Programm, das Funktionsplots in einem x-y-Koordinatenkreuz graphisch ausgibt. Dazu verwende ich eine Klasse CGraph von www.codeguru.com. In dieser Klasse wird sehr häufig (genauer gesagt für jede einzelne Zeichenoperation einer Linie zwischen zwei Punkten des Funktionsgraphen, also für einen vollständigen Graphen mehrere hundert- oder gar tausendmal!) ein neuer Device Context angefordert (natürlich auch jedes Mal wieder freigegeben).
Sofern ich einmal einen Graphen zeichne und den dann unverändert so stehen lasse, gibt's dabei auch keine Probleme. Zeichne ich aber fortwährend einen neuen Graphen, weil sich die darzustellende Funktion laufend verändert (Echtzeitvisualisierung von Meßdaten), mit einer Framerate von etwa 5 fps, gibt es meist nach etwa 1000 Frames einen Programmabsturz, was - wie ich herausgefunden habe - daran liegt, daß für den angeforderten Device Context nur noch NULL zurückgegeben wird.
Kann das daran liegen, daß die Häufigkeit, mit der ein Device Context angefordert wird, schlicht zu hoch ist? In der Zeit bis zum Programmabsturz passiert das immerhin einige hunderttausendmal. Ich hab mir mal meine älteren OpenGL-Programme angeschaut und festgestellt, daß dort für die gesamte Programmlaufzeit immer nur ein einziger Device Context angefordert wird (hab ich von den Tutorials auf http://www.codeworx.org/opengl_tuts.php übernommen). Wäre das vorzuziehen? Spielt es vielleicht eine Rolle, ob das Fenster, dessen Device Context angefordert wird (das Fenster in der die CGraph-Instanz integriert ist), die Eigenschaft CS_OWNDC hat? Unter der Win32-API konnte man die ja beim Initialisieren der Fensterklasse festlegen, aber unter der MFC scheint das nicht mehr möglich zu sein...
Hier mal ein Codeausschnitt aus der CGraph-Klasse, mit dem Anfordern eines Device Context:
void CGraph::DrawLine(int x1, int y1, int x2, int y2)
{
// Device Context vom Parent Fenster anfordern
// m_pWnd ist ein Pointer auf die CWnd-Instanz des Parent-Fensters
CDC *pdc = m_pWnd->GetDC();
// Zeichenoperationen mit pdc...
// m_pWnd->ReleaseDC(pdc);
}
Wäre statt der Zeile CDC *pdc = m_pWnd->GetDC(); vielleicht ClientDC dc(m_pWnd); besser?
Ich arbeite z.Z. an einem Programm, das Funktionsplots in einem x-y-Koordinatenkreuz graphisch ausgibt. Dazu verwende ich eine Klasse CGraph von www.codeguru.com. In dieser Klasse wird sehr häufig (genauer gesagt für jede einzelne Zeichenoperation einer Linie zwischen zwei Punkten des Funktionsgraphen, also für einen vollständigen Graphen mehrere hundert- oder gar tausendmal!) ein neuer Device Context angefordert (natürlich auch jedes Mal wieder freigegeben).
Sofern ich einmal einen Graphen zeichne und den dann unverändert so stehen lasse, gibt's dabei auch keine Probleme. Zeichne ich aber fortwährend einen neuen Graphen, weil sich die darzustellende Funktion laufend verändert (Echtzeitvisualisierung von Meßdaten), mit einer Framerate von etwa 5 fps, gibt es meist nach etwa 1000 Frames einen Programmabsturz, was - wie ich herausgefunden habe - daran liegt, daß für den angeforderten Device Context nur noch NULL zurückgegeben wird.
Kann das daran liegen, daß die Häufigkeit, mit der ein Device Context angefordert wird, schlicht zu hoch ist? In der Zeit bis zum Programmabsturz passiert das immerhin einige hunderttausendmal. Ich hab mir mal meine älteren OpenGL-Programme angeschaut und festgestellt, daß dort für die gesamte Programmlaufzeit immer nur ein einziger Device Context angefordert wird (hab ich von den Tutorials auf http://www.codeworx.org/opengl_tuts.php übernommen). Wäre das vorzuziehen? Spielt es vielleicht eine Rolle, ob das Fenster, dessen Device Context angefordert wird (das Fenster in der die CGraph-Instanz integriert ist), die Eigenschaft CS_OWNDC hat? Unter der Win32-API konnte man die ja beim Initialisieren der Fensterklasse festlegen, aber unter der MFC scheint das nicht mehr möglich zu sein...
Hier mal ein Codeausschnitt aus der CGraph-Klasse, mit dem Anfordern eines Device Context:
void CGraph::DrawLine(int x1, int y1, int x2, int y2)
{
// Device Context vom Parent Fenster anfordern
// m_pWnd ist ein Pointer auf die CWnd-Instanz des Parent-Fensters
CDC *pdc = m_pWnd->GetDC();
// Zeichenoperationen mit pdc...
// m_pWnd->ReleaseDC(pdc);
}
Wäre statt der Zeile CDC *pdc = m_pWnd->GetDC(); vielleicht ClientDC dc(m_pWnd); besser?