PrintWindow() - Bug?
-
Hallo Leute,
ich habe das Problem, dass die PrintWindow() funktion nach jedem aufruf länger dauert - das fängt bei 0.02sec an und steigert sich so lange, bis die gesamte Applikation abstürtzt(ca. 1h).
Es wird immer der gleiche code in einer for-schleife ausgeführt, mit Sleep() wird dann eine gwisse Zeit gewartet, bis die For-schleife sich wiederholt.
// print window to seperate dc PrintWindow( pt.hWnd, m_ptBuffer[iT].dcmem, 0 );Sobald die PrintWindow methode kommentiert ist, funktioniert alles wunderbar. Hat jemand bereits Erfahrungen mit dem Attribut PW_CLIENTONLY ?(letzten Parameter)
Evt. kann jemand damit schon Erfahrungen sammeln können.Mfg
JJLinks:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_6qpj.asp
-
Klingt, als wenn irgendeine Schleife rekursiv aufgerufen wird, oder nach Speicherleaks.
-
vielleicht verursacht die paint-funktion des fensters ein gdi-leak.
-
Also das Problem wurde an sich "behoben". Wenn die Funktion GetDC() des gleichen Fensters vor PrintWindow() aufgerufen wird, kommt dieser leak zu stande. Nachdem die Funktion entfernt wurde, lief alles wunderbar.
Was ein weiteres Problem ist - dass das Fenster, nachdem PrintWindow() aufgerufe wurde, nicht mehr ordentlich gezeichnet wird..
Durch ein UpdateWindow() aufgruf konnte ich das Problem teilweise beheben, wobei es dennoch hin und wieder zu Darstellungsproblemem gekommen ist.Durch den UpdateWindow() aufgruf gehen mir, laut Profiler, ca. 0.01 sekunden flöten, was natürlich wieder nicht spannend ist.
Evt. fällt jemanden was zu diesen Fakten ein/auf.
-
GetDC(); ReleaseDC();
-
Hm ... dafür besten Dank! Hatte ich glatt vergessen. Dennoch Wird das Fenster trotzdem nicht richtig angezeigt, da die GetDC() funktion nicht mehr aufgerufen wird.
-
Also es ist definitiv in meinem Fall so, dass durch das Aufrufen von PrintWindow() das Fenster nicht richtig dargestellt(gezeichnet) wird.
Wenn würde es helfen, wenn jemand andere Erfahrungen damit gemacht hat.
-
Also ich poste hier ein mal ein wenig Code:
(Dieser Code wird Continuierlich alle 1000 ms ausgeführt)HDC dcWindow = GetWindowDC( pt->hWnd ); // create backgrond dc buf.dcmem = CreateCompatibleDC( dcWindow ); if( buf.dcmem ) { RECT rc; GetWindowRect( pt->hWnd, &rc); buf.hBM = CreateCompatibleBitmap( dcWindow, pt->wnd_matrix.right-pt->wnd_matrix.left, pt->wnd_matrix.bottom-pt->wnd_matrix.top ); if( buf.hBM ) { buf.hBMold = (HBITMAP)SelectObject ( buf.dcmem, buf.hBM ); PrintWindow( pt->hWnd, buf.dcmem, 0 ); DeleteObject( buf.hBM ); } DeleteObject( buf.dcmem ); } else { OutputDebugString( "\nError" ); } ReleaseDC( pt->hWnd, dcWindow ); UpdateWindow( pt->hWnd ); // hat keine Auswirkung return TRUE;
-
Jayjay schrieb:
Also ich poste hier ein mal ein wenig Code:
(Dieser Code wird Continuierlich alle 1000 ms ausgeführt)LOOOL, deine Code enthält haufenweise GDI-Leaks...
DeleteDC(buf.dcmem); fehlt,
Du musst den Inhalt, der vorher in einem DC war auch wieder einsetzen
!
Da fehlt also irg wo auch noch SelectObject. Geh besser den Code nochmal durch.