Bild mit Desktop vergleichen

nun, mit zwei bitmaps belegst du höchstens 1mb schätzungsweise. Dein Fall klingt sehr nach Speicherleck. Benuzt du irgendwo new in einer Schleife ohe es wieder mit delete zu löschen?

-----------------------------------------------------------------------------------------------------------

devDevil hat gesagt.:
ehm und
C++:
Bitmap bmp[20]; //nun hast du speicher für 20 Bitmaps belegt
bmp[19]=NULL; /*Damit belegst du das lezte Element des Arrays*/
... dazu sag ich einfach mal nix ... nem Objekt NULL (0) zuweisen .... und der rest ist auch schwachsin :D
mir ist klar das ein Objekt nicht mit NULL belegt werden kann-.- Dies diente eher der Symbolik. Des weiteren siehe da:
http://www.tutorials.de/forum/c-c/339858-bild-mit-desktop-vergleichen.html#post1756896.

Habe ich mich hier nicht zu meinem eigenen Schwachsinn bekannt, und mich folglich korregiert?;)

-----------------------------------------------------------------------------------------------------------

Doccos hat gesagt.:
Kleine Frage noch:
gibts wo ne Site wo alle Funktionen on C++ aufgelistet sind?

Oh doch die gibt es:D^^ Z.b. die msdn datenbank von Microsoft. Seeehr Umfangreich;)
Poste doch mal deinen kompltetten Programmcode hier. Würde mir jetzt mal gerne anschauen, wie du es realisiert hast;) (vorrausgesetzt du bist mit der Veröffentlichung deines Codes einverstanden;))
 
Zuletzt bearbeitet:
Ich hab eigentlich in meinem Script niergents nen New drinnen o_O


Das is das Script zum Bildervergleich:
Code:
int vergleich(int posx, int posy, int typ)
{
	bposx = posx;
	bposy = posy;

int q = 0;
int ergebniss = 1;
	int ruck;	

		  
		  // GDI+ initialisieren
		  GdiplusStartupInput gdiplusStartupInput;
		  ULONG_PTR gdiplusToken;
		  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
		
		  // Scopeklammern, damit alle Objekte vor GdiPlusShutdown zerstört sind
		    {
    Bitmap bm1( L"C:\\bilder\\vergleich.bmp" );

SRCCOPY));
		HDC Screen = GetDC(0);
		HBITMAP Capture = CreateCompatibleBitmap(Screen, 1680, 920);
		HDC Image = CreateCompatibleDC(Screen);
		HBITMAP OldBitmap = (HBITMAP)SelectObject(Image, Capture);
		BitBlt(Image, 0, 0, 1680, 920, Screen,
		0, 0, SRCCOPY);
		SelectObject(Image, OldBitmap);

		Bitmap* bm2 = Bitmap::FromHBITMAP(Capture,NULL);
	
		do {
		  if( q >= 14)
		  {
			ergebniss = 2;
			
		  }			

      int nDifferentPixels = 0;
      Color color1, color2;
      for( int x=0; x<22; ++x ) {
        for( int y=0; y<15; ++y ) {
          if( Ok == bm1.GetPixel( x+(22*q),y, &color1 ) && Ok == bm2->GetPixel( bposx - 22 + x,bposy - 15 + y, &color2 ) ) {
            if( color1.GetValue() != color2.GetValue() ) {
              ++nDifferentPixels;

            }
          }
        }
     }
	
	if(nDifferentPixels <= 1)
			  {
				//deleteDC(bm2);
				//delete bm1;
					 
					  return q;
				
			  }
      //
	  //cout << "Unterschiedliche Pixel: " << nDifferentPixels << " Q: " << q << " X: " << bposx << " Y: " << bposy << endl;
			/*  if(nDifferentPixels <= 1)
			  {
				  
					 cout << "-----> Unterschiedliche Pixel: " << nDifferentPixels << " Q: " << q << " X: " << bposx << " Y: " << bposy <<  endl;
      int nDifferentPixels = 0;
      Color color1, color2;
      for( int x=0; x<22; ++x ) {
        for( int y=0; y<15; ++y ) {
          if( Ok == bm1.GetPixel( x+(22*q),y, &color1 ) && Ok == bm2.GetPixel( bposx - 22 + x,bposy - 15 + y, &color2 ) ) {
            if( color1.GetValue() != color2.GetValue() ) {
              ++nDifferentPixels;
				cout << "x " << x << " y " << y << endl;
            }
          }
        }
      }

			  } */

   
	  

	 
	++q;
	} while(ergebniss != 2);
		  
	//cout << "return " << q << endl;
  }
	  GdiplusShutdown(gdiplusToken);
	  Sleep(1000);
	  return ruck;
}


//////////////////////EDIT///////////////////////
Also hab grad getestet wenn er immer das gleiche Bild nimmt also kein neuen Screenshot macht verändert sich der Arbeitsspeicherverbrauch nicht also muss es daran liegen
 
Zuletzt bearbeitet:
Hm.. Also dieser Codeschnipsel hilft mir nicht viel (ist ja eh die hälfte code auskommentiert). Aber an deiner Funkton scheint nix tolles dran zu sein. Jedoch eine Frage du Lädst dein Vergleichsbild immer wieder neu(beim Funktionsaufruf), was eigentlich nicht weiter dramatisch, aber unschön ist. Aber du machst auch immer wieder neue Screenshots...

Wie oft und wie rufst du deine Funktion den Auf?
 
Die Funktion wird ca alle 2 Sekunden aufgerufen
Aber wie gesagt wenn ich bm2 mit einen Bild austausche was immer gleich ist bleibt der Arbeitsspeicher unverändert also muss es irgentwo hier liegen:

Code:
		HDC Screen = GetDC(0);
		HBITMAP Capture = CreateCompatibleBitmap(Screen, 1680, 920);
		HDC Image = CreateCompatibleDC(Screen);
		HBITMAP OldBitmap = (HBITMAP)SelectObject(Image, Capture);
		BitBlt(Image, 0, 0, 1680, 920, Screen,
		0, 0, SRCCOPY);
		SelectObject(Image, OldBitmap);

		Bitmap* bm2 = Bitmap::FromHBITMAP(Capture,NULL);
 
Kopier diesen Code doch mal Raus aus der Schleife und mach ihn testweise global (in keine Funktion, über die main, unter die includes).

Kenne die Bitmap Klasse nicht, aber es Scheint, dass du bei jedem Funktionsaufruf ein neues Screenshot machst, und dieser dan unnötig Arbeitspeicher frist.
 
Hm. Probiers mit memset(); Weil ich weis grad echt nicht an welcher Stelle dein Speicherleck entsteht:(
 
in etwa so:
C++:
int test = 100;

cout<<test; //Ausgabe = 100

memset ( test, 1, sizeof( test ) );

cout<<test; //Ausgabe = 1;

Aufdein Besipiel übetragen;)

..du findest nix zu funktionen. DAS sollte immer deine erste Anlaufstelle sein, bevor du nach erklärungen zu funktionen suchst;)
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Du mußt das Bitmap Objekt welches du durch den Aufruf von Bitmap::FromHBITMAP erzeugt hast mit delete freigeben wenn du es nicht mehr brauchst.

Gruß
 

Neue Beiträge

Zurück