<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Auslagerungsdateiauslastung ständig steigend]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Ich beschäftige mich derzeit (mal Wieder) mit dem Thema &quot;Grafik flimmerfrei von a nach b zu bewegen.<br />
Mit Hilfe des Codes aus der FAQ und etwas Eigenzutun funktioniert das alles.<br />
ABER:<br />
Während das Programm läuft und die Grafik sich bewegt lässt sich im<br />
Taskmanager unter Systemleistung feststellen, das ständig neuer Speicher<br />
zugesichert wird. Und dann irgendwann verschwindet meine Grafik aus dem<br />
Programm.</p>
<p>Hier mal der Code:</p>
<pre><code>void Lade_Bitmap(HWND hWnd, int NEUX, int NEUY)
{
	PAINTSTRUCT ps;
	HBITMAP hBg, hSprite;
	HDC Bildhdc, Bghdc, Spritehdc, Bufferhdc;

	InvalidateRect(hWnd, NULL, false);

	Bildhdc = BeginPaint (hWnd, &amp;ps);

//Bilder aus einer Datei in hdc holen
	hBg = (HBITMAP)LoadImage(NULL, &quot;bg.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);  
	hSprite = (HBITMAP)LoadImage(NULL, &quot;sprite.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

	Bufferhdc = CreateCompatibleDC(Bildhdc);
	Bghdc = CreateCompatibleDC(Bildhdc);
	Spritehdc = CreateCompatibleDC(Bildhdc);

	HBITMAP hOldBg = (HBITMAP) SelectObject(Bghdc, hBg);
	HBITMAP hOldSprite = (HBITMAP) SelectObject(Spritehdc, hSprite);

	Bufferhdc = Bghdc;
	TransparentBlt(Bufferhdc, NEUX, NEUY, WIDICON, HIGICON, Spritehdc, 0, 0, 16, 16, RGB(0,0,0));

	BitBlt(Bildhdc, 0, 0, 400, 400, Bufferhdc, 0, 0, SRCCOPY);

	SelectObject(Bildhdc, hOldBg);
	SelectObject(Bildhdc, hOldSprite);

	DeleteDC(Bufferhdc);
    DeleteDC(Bghdc);
	DeleteDC(Spritehdc);

	DeleteObject(hBg);
	DeleteObject(hSprite);

	EndPaint( hWnd, &amp;ps );
}
</code></pre>
<p>Hoffentlich fitzt ihr euch dadurch, auch wenn es umständlich aussieht, aber das ist durch ständiges umschreiben so zustande gekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/95970/auslagerungsdateiauslastung-ständig-steigend</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 19:48:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/95970.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Dec 2004 13:55:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 13:55:40 GMT]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Ich beschäftige mich derzeit (mal Wieder) mit dem Thema &quot;Grafik flimmerfrei von a nach b zu bewegen.<br />
Mit Hilfe des Codes aus der FAQ und etwas Eigenzutun funktioniert das alles.<br />
ABER:<br />
Während das Programm läuft und die Grafik sich bewegt lässt sich im<br />
Taskmanager unter Systemleistung feststellen, das ständig neuer Speicher<br />
zugesichert wird. Und dann irgendwann verschwindet meine Grafik aus dem<br />
Programm.</p>
<p>Hier mal der Code:</p>
<pre><code>void Lade_Bitmap(HWND hWnd, int NEUX, int NEUY)
{
	PAINTSTRUCT ps;
	HBITMAP hBg, hSprite;
	HDC Bildhdc, Bghdc, Spritehdc, Bufferhdc;

	InvalidateRect(hWnd, NULL, false);

	Bildhdc = BeginPaint (hWnd, &amp;ps);

//Bilder aus einer Datei in hdc holen
	hBg = (HBITMAP)LoadImage(NULL, &quot;bg.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);  
	hSprite = (HBITMAP)LoadImage(NULL, &quot;sprite.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

	Bufferhdc = CreateCompatibleDC(Bildhdc);
	Bghdc = CreateCompatibleDC(Bildhdc);
	Spritehdc = CreateCompatibleDC(Bildhdc);

	HBITMAP hOldBg = (HBITMAP) SelectObject(Bghdc, hBg);
	HBITMAP hOldSprite = (HBITMAP) SelectObject(Spritehdc, hSprite);

	Bufferhdc = Bghdc;
	TransparentBlt(Bufferhdc, NEUX, NEUY, WIDICON, HIGICON, Spritehdc, 0, 0, 16, 16, RGB(0,0,0));

	BitBlt(Bildhdc, 0, 0, 400, 400, Bufferhdc, 0, 0, SRCCOPY);

	SelectObject(Bildhdc, hOldBg);
	SelectObject(Bildhdc, hOldSprite);

	DeleteDC(Bufferhdc);
    DeleteDC(Bghdc);
	DeleteDC(Spritehdc);

	DeleteObject(hBg);
	DeleteObject(hSprite);

	EndPaint( hWnd, &amp;ps );
}
</code></pre>
<p>Hoffentlich fitzt ihr euch dadurch, auch wenn es umständlich aussieht, aber das ist durch ständiges umschreiben so zustande gekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681046</guid><dc:creator><![CDATA[Anfaenger nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 13:55:40 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:10:52 GMT]]></title><description><![CDATA[<p>Die Funktion rufst du doch in WM_PAINT auf, oder? Da würd ich auf keinen Fall das InvalidateRect benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681065</guid><dc:creator><![CDATA[~~~~~~]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:10:52 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:17:39 GMT]]></title><description><![CDATA[<p>Und falls du Windows 95/98 benutzt:</p>
<p>Platform SDK schrieb:</p>
<blockquote>
<p>Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/681082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681082</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:22:58 GMT]]></title><description><![CDATA[<p>Ich benutzt Windows XP.<br />
Die Funktion wird aufgerufen aus meiner WM_TIMER, in der ich eine Kollisionskontrolle mit den Außenwänden drin habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681087</guid><dc:creator><![CDATA[Anfaenger nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:24:08 GMT]]></title><description><![CDATA[<p>BeginPaint und EndPaint nur im WM_PAINT Handler nutzen. Im WM_TIMER Handler nur InvalidateRect aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681091</guid><dc:creator><![CDATA[funker]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:32:50 GMT]]></title><description><![CDATA[<p>So, ich sende jetzt von meinem WM_TIMER eine Nachricht<br />
WndProg(hwnd, WM_PAINT,NULL,NULL); damit ich die Funktion im WM_PAINT aufrufe.<br />
Das InvalidateRect habe ich nach den Aufruf der Funktion WndProg angefügt und aus der Lade-Bitmap-Funktion gelöscht. Egal wie ich es drehe oder wende, dass Problem besteht weiterhin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681101</guid><dc:creator><![CDATA[Anfaenger nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:41:27 GMT]]></title><description><![CDATA[<p>Anfaenger nr 5 schrieb:</p>
<blockquote>
<p>So, ich sende jetzt von meinem WM_TIMER eine Nachricht<br />
WndProg(hwnd, WM_PAINT,NULL,NULL); damit ich die Funktion im WM_PAINT aufrufe.</p>
</blockquote>
<p>Das ist doch sinnlos.</p>
<p>So rufst du BeginPaint zwar scheinbar nur bei WM_PAINT auf. Aber denkst du wirklich es macht für Windows einen Unterschied, ob du BeginPaint direkt bei WM_TIMER ausführst oder über den Umweg mit &quot;WndProg(hwnd, WM_PAINT,NULL,NULL);&quot;? Windows verlangt, dass BeginPaint nur dann aufgerufen wird, wenn dein Fenster von Windows WM_PAINT erhält.</p>
<p>Nimm bei WM_TIMER InvalidateRect (als dritten Parameter FALSE, sonst hast du wieder flackern). Wenn du dann UpdateWindow aufrufst, schickt Windows deinem Fenster ein WM_PAINT. Erst dort darfst du mit BeginPaint kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681108</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:41:27 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 14:46:50 GMT]]></title><description><![CDATA[<p>Nagut:<br />
Folgendes hab ich jetzt<br />
Bei WM_TIMER steht jetzt</p>
<pre><code>UpdateWindow(hWnd);
InvalidateRect(hWnd, NULL, false);
</code></pre>
<p>Bei WM_PAINT steht die schon oben gepostete Funktion ohne das InvalidateRect.<br />
Mir scheint, als ob ich alles befolgt habe, was ihr mir gesagt habt.<br />
Aber mein Problem besteht immer noch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681117</guid><dc:creator><![CDATA[Anfaenger Nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 14:46:50 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 15:03:04 GMT]]></title><description><![CDATA[<p>Wenn schon InvalidateRect und dann UpdateWindow. Aber UpdateWindow brauch man normalerweise nicht. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681124</guid><dc:creator><![CDATA[tzz]]></dc:creator><pubDate>Sun, 26 Dec 2004 15:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 15:26:56 GMT]]></title><description><![CDATA[<p>Nagut. Folgendes von meiner Seite. Auch wenn es die Leute nicht gerne sehen, werde ich jetzt das komplette Programm posten. Warum? Weil hier nicht auf das eigentliche Problem eingegangen wird.</p>
<p>Ich müsste noch eine Bitmap zeichen (400<em>400) komplett schwarz<br />
und eine (16</em>16) blauer ausgemalter Kreis auf schwarzen Hintergrund.</p>
<p>Bitte keine Fragen warum und wieso die Bitmaps so sein sollen. ist eben so *g*</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;

#define WIDICON 16
#define HIGICON 16

ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

void Lade_Bitmap(HWND hWnd, int NEUX, int NEUY);

int Laufrichtung = 1;

int IndexX=400, IndexY=200;
int punkte[400][400];

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
	MSG msg;

	MyRegisterClass(hInstance);

	if(!InitInstance( hInstance, nCmdShow ))	return FALSE;

	punkte[IndexX][IndexY] = 1;

	while( GetMessage(&amp;msg, NULL, 0, 0) ) 
	{
		TranslateMessage( &amp;msg );
		DispatchMessage( &amp;msg );
	}

	return msg.wParam;

	return 0;
}

ATOM MyRegisterClass( HINSTANCE hInstance )
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 
	wcex.style			= NULL;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= NULL;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH) (COLOR_WINDOWTEXT);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= &quot;MYWINDOW&quot;;				//=^1.Operator in Create Window
	wcex.hIconSm		= NULL;

	return RegisterClassEx(&amp;wcex);
}

BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
   HWND hWnd;

   hWnd = CreateWindow(&quot;MYWINDOW&quot;, &quot;Fenster1&quot;,WS_POPUP,
      0, 0, 400, 400, NULL, NULL, hInstance, NULL);

   if(!hWnd)   return FALSE;

   ShowWindow( hWnd, nCmdShow );
   UpdateWindow( hWnd );

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int X = 200;
	static int Y = 20;

	switch( message ) 
	{
		case WM_CREATE:	
			Laufrichtung = 1;
			SetTimer(hWnd, NULL, 10, NULL);
			break;

//von linksoben --&gt; rechtsunten  Laufrichtung = 1
//von rechtsoben --&gt; linksunten  Laufrichtung = 2
//von linksunten --&gt; rechtsoben  Laufrichtung = 3
//von rechtsunten --&gt; linksoben  Laufrichtung = 4
		case WM_TIMER:
			if (Laufrichtung ==1) {
				if (X==384) Laufrichtung =2;
				else if (Y == 384) Laufrichtung = 3;
			}
			else if (Laufrichtung ==2) {
				if (X==0) Laufrichtung =1;
				else if (Y == 384) Laufrichtung = 4;
			}
			else if (Laufrichtung ==3) {
				if (X==384) Laufrichtung =4;
				else if (Y == 0) Laufrichtung = 1;
			}
			else if (Laufrichtung ==4) {
				if (X==0) Laufrichtung =3;
				else if (Y == 0) Laufrichtung = 2;
			}
			if (Laufrichtung ==1)
			{
				X++;
				Y++;
			}
			else if(Laufrichtung ==2)
			{
				X--;
				Y++;
			}
			else if(Laufrichtung ==3)
			{
				X++;
				Y--;
			}
			else if(Laufrichtung ==4)
			{
				X--;
				Y--;
			}

			InvalidateRect(hWnd, NULL, false);
			UpdateWindow(hWnd);
			//Lade_Bitmap(hWnd, X, Y);
			break;

		case WM_PAINT:
			Lade_Bitmap(hWnd, X, Y);
			break;

		case WM_DESTROY:
			KillTimer(hWnd, NULL);
			PostQuitMessage( 0 );
			break;
		default:
			return DefWindowProc( hWnd, message, wParam, lParam );
   }
   return 0;
}

//Übergabe des Handles und der Koordinatenwerte, an der die Grafik gezeichnet wird
void Lade_Bitmap(HWND hWnd, int NEUX, int NEUY)
{
	PAINTSTRUCT ps;
	HBITMAP hBg, hSprite;
	HDC Bildhdc, Bghdc, Spritehdc, Bufferhdc;

	Bildhdc = BeginPaint (hWnd, &amp;ps);

//Bilder aus einer Datei in hdc holen
	hBg = (HBITMAP)LoadImage(NULL, &quot;bg.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);  
	hSprite = (HBITMAP)LoadImage(NULL, &quot;sprite.bmp&quot;, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 

	Bufferhdc = CreateCompatibleDC(Bildhdc);
	Bghdc = CreateCompatibleDC(Bildhdc);
	Spritehdc = CreateCompatibleDC(Bildhdc);

	HBITMAP hOldBg = (HBITMAP) SelectObject(Bghdc, hBg);
	HBITMAP hOldSprite = (HBITMAP) SelectObject(Spritehdc, hSprite);

	Bufferhdc = Bghdc;
	//BitBlt(Bufferhdc, NEUX, NEUY, WIDICON, HIGICON,Spritehdc,0,0,SRCCOPY);
	TransparentBlt(Bufferhdc, NEUX, NEUY, WIDICON, HIGICON, Spritehdc, 0, 0, 16, 16, RGB(0,0,0));

	BitBlt(Bildhdc, 0, 0, 400, 400, Bufferhdc, 0, 0, SRCCOPY);

	SelectObject(Bildhdc, hOldBg);
	SelectObject(Bildhdc, hOldSprite);

	DeleteDC(Bufferhdc);
    DeleteDC(Bghdc);
	DeleteDC(Spritehdc);

	DeleteObject(hBg);
	DeleteObject(hSprite);

	EndPaint( hWnd, &amp;ps );
}
</code></pre>
<p>Eingebunden wird nur windows.h in der stdafx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681140</guid><dc:creator><![CDATA[Anfaenger Nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 15:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 15:36:14 GMT]]></title><description><![CDATA[<p>Du lädst bei jedem WM_PAINT die Bitmaps neu von der Festplatte. Da wundert es mich nicht, dass dein Programm langsam läuft.<br />
Besser wäre es die Bitmaps z.B. bei WM_CREATE zu laden und bei WM_DESTROY freizugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681149</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 26 Dec 2004 15:36:14 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 18:14:23 GMT]]></title><description><![CDATA[<p>Ich weiß, dass ich heute wieder besonders nerve. Eigentlich ist es das erste mal, dass ich nerve. Aber es hilft ja alles nichts.<br />
Habe cd9000´s mal durchdacht und schien mir logisch.</p>
<p>Nach der Umsetzung wird aber trotzdem ständig neuer Speicher zugesichert.</p>
<p>Lade die Bitmaps jetzt in der WM_CREATE und gebe sie in der WM_DESTROY wieder frei.<br />
Ich weiß ja auch nicht, ob das nur bei mir so ist. Ich gebe ja schließlich den Speicher wieder frei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681240</guid><dc:creator><![CDATA[Anfaenger Nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 18:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 18:23:32 GMT]]></title><description><![CDATA[<p>Nach Stunden suchen habe ich den Fehler gefunden.<br />
Es ist die Zeile</p>
<p>Bufferhdc = Bghdc;</p>
<p>So doof kann aber auch nur ich sein. Schließlich gibt es ja die Funktion Bitblt. warum ich das mit = mache frag ich mich jetzt auch.</p>
<p>Trotzdem danke für die vielen Tipps.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681253</guid><dc:creator><![CDATA[Anfaenger Nr 5]]></dc:creator><pubDate>Sun, 26 Dec 2004 18:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Auslagerungsdateiauslastung ständig steigend on Sun, 26 Dec 2004 19:22:43 GMT]]></title><description><![CDATA[<p>Deine riesigen &quot;if (Laufrichtung == &quot; Konstrukte solltest Du auch mal durch einen switch ersetzen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/681294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/681294</guid><dc:creator><![CDATA[Hepi]]></dc:creator><pubDate>Sun, 26 Dec 2004 19:22:43 GMT</pubDate></item></channel></rss>