PixelFormat=pf24bit versucht Arbeitsspeicherüberlastung



  • Die Zwei Zeilen hab ich ausversehen mit übergenommen.
    Und was dir an dem ReleaseDC nicht gefällt verstehe ich auch nicht.
    Ich habe jetzt mal so gemacht, aber besser wurde davon jetzt auch nicht:

    DWORD WINAPI ScanFunc( LPVOID lpParam )
    {
     while(whilethread==true)
     {
      if(scanthread==true)
      {
       Graphics::TBitmap *bmp = new Graphics::TBitmap();
       DeskH =  GetDesktopWindow();
       dc = GetWindowDC(GetDesktopWindow());
       bmp->PixelFormat=pf24bit;
    
       bmp->Width = iSizeW;
       bmp->Height = iSizeH;
       BitBlt(bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, dc, 0, 0, SRCCOPY);
    
       for(scany=0; scany < bmp->Height; scany++)
       {
    	ypix = reinterpret_cast<TRGBTriple *>(bmp->ScanLine[scany]);
    	for(scanx=0; scanx < bmp->Width; scanx++)
    	{
    	  if(ypix[scanx].rgbtBlue == 49 && ypix[scanx].rgbtGreen==247 &&
    		ypix[scanx].rgbtRed ==255)
    	 {
    	  MessageBox(0,"Gefunden","test1",MB_OK);
    	 }
    	}
       }
    
      bmp->FreeImage();
      ReleaseDC(DeskH,dc);
      delete bmp;
      }
      Sleep(100);
     }
     return 0;
    }
    


  • Hallo,

    Das FreeImage hier brauchst du nicht. Weietrhin würde ich das Erzeugen und zerstören des Bitmaps aus der while-Schleife nehmen.



  • Braunstein schrieb:

    Hallo,

    Das FreeImage hier brauchst du nicht. Weietrhin würde ich das Erzeugen und zerstören des Bitmaps aus der while-Schleife nehmen.

    Hab ich mal versucht. Hab dabei folgendes bemerkt:
    Wenn

    bmp = new Graphics::TBitmap();
    

    oder

    bmp->PixelFormat=pf24/*32*/bit;
    

    nur 1mal festgelegt wird, gibt es zwar keine Arbeitsspeicherüberstung aber dafür funktioniert es nicht.
    Hab versucht und hab wie du sagtest,

    Graphics::TBitmap *bmp = new Graphics::TBitmap()
    

    und

    delete bmp;
    

    außerhalb der Schleife gemacht und nach dem es nicht geklappt hat, hab ich wieder zurück umgebaut und hab

    bmp->PixelFormat=pf24/*32*/bit;
    

    nur 1mal ausführen gelassen:

    if(test011==true)
       {
       bmp->PixelFormat=pf24bit;
       test011 = false;
       }
    

    Ja, und wie gesagt, Funtion geht nicht, dafür ist aber alles OK mit dem Speicher.



  • So, ich schreibe wieder, weil ich fast herausgefunden an was es liegt, dass es nicht funtioniert.
    Alles was nicht drin ist, wird wo anders ausgeführt. z.B. delete bmp; steht unter dem OnClose event.

    DWORD WINAPI ScanFunc( LPVOID lpParam )
    {
     while(whilethread==true)
     {
      if(scanthread==true)
      {
       DeskH = GetDesktopWindow();
       dc = GetWindowDC(DeskH);
       bmp->PixelFormat=pf24bit;
       BitBlt(bmp->Canvas->Handle, 0, 0, bmp->Width, bmp->Height, dc, 0, 0, SRCCOPY);
    
       for(scany=0; scany < bmp->Height; scany++)
       {
    	ypix = reinterpret_cast<TRGBTriple *>(bmp->ScanLine[scany]);
    	for(scanx=0; scanx < bmp->Width; scanx++)
    	{
    	  if(ypix[scanx].rgbtBlue == 49 && ypix[scanx].rgbtGreen==247 &&
    		ypix[scanx].rgbtRed ==255)
    	 {
               sk.SendKeys("{BEEP 350 300}");
    	  //MessageBox(0,"Gefunden","test1",MB_OK);
    	 }
    	}
       }
      ReleaseDC(DeskH,dc);
      }
      Sleep(100);
     }
     return 0;
    }
    

    Also, was passiert hier:
    Keine Arbeitsspeicherüberlastung.
    Dafür aber macht er irgendwie nur einmal screen shot oder so was in der art.
    Wenn ich das Bild wo sich die gewünschte Farbe öffne und erst dann die Funtion lauden lasse, dann findet er die farbe

    sk.SendKeys("{BEEP 350 300}");
    

    Macht beep Geräusche und so weiß ich, dass es die Farbe findet. Wenn ich das Bild minimiere hört es nicht auf zu beepen. Deshalb gehe ich davon aus, dass irgendwas nicht überschrieben wird.
    Hat jemand eie Idee?


Anmelden zum Antworten