Bos Taurus problem?

Moderator: Rathinagiri

User avatar
andyglezl
Posts: 1205
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 37 times
Been thanked: 86 times
Contact:

Re: Bos Taurus problem?

Post by andyglezl » Fri Sep 16, 2016 4:33 am

Ya vieron este post ?
Quizá hubo algún cambio significativo despues de esta version...


viewtopic.php?f=35&t=4381

koke wrote:Hola Luis
con la nueva versión de de hmg 3.4.1 se soluciono el problema de memoria, ya hace un rato que lo descargue y hasta el momento se han acabado todos los problemas referentes a la memoria.
Saludos.

De esta otra forma, también hace lo mismo...

Code: Select all

#include "hmg.ch"

*------------------------------------------------------------------------------*
Function Main()
*------------------------------------------------------------------------------*
   DEFINE WINDOW Win_1 ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT 400 ;
      TITLE '' //;
      // MAIN 

      define button test
         row 10
         col 10
         caption 'test'
         action test()
      end button
   END WINDOW
   ACTIVATE WINDOW Win_1
Return
*-----------------------------------------------------------------------------------*
procedure test
*-----------------------------------------------------------------------------------*
local i, hDesktop, nDesktopWidth, nDesktopHeight
	for i := 1 to 1000
		cFileName := strzero(i,4)+".jpg"
		hBitmap := BT_BitmapCaptureDesktop( )  
		BT_BitmapSaveFile( hBitmap, cFileName, BT_FILEFORMAT_JPG )
		BT_BitmapRelease( hBitmap )
	next i
	
	msginfo('fin')
return
Andrés González López
Desde Guadalajara, Jalisco. México.

User avatar
srvet_claudio
Posts: 2044
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 35 times
Been thanked: 148 times
Contact:

Post by srvet_claudio » Fri Sep 16, 2016 7:19 pm

Hi Roberto,
try with this code, work fine for me in Win XP 32 bit.
I added the functions:
RELEASE MEMORY
DO EVENTS
hb_releaseCPU()

Code: Select all

#include "hmg.ch"

*------------------------------------------------------------------------------*
Function Main()
*------------------------------------------------------------------------------*

   DEFINE WINDOW Win_1 ;
      AT 0,0 ;
      WIDTH 400 ;
      HEIGHT NIL ;
      TITLE '' ;
      MAIN 

      define button test
         row 10
         col 10
         caption 'test'
         action test()
      end button

      @ 50, 10 LABEL Label_1 AUTOSIZE
      
   END WINDOW

   ACTIVATE WINDOW Win_1

Return

*-----------------------------------------------------------------------------------*
procedure test
*-----------------------------------------------------------------------------------*
local i, hDesktop, nDesktopWidth, nDesktopHeight

   hDesktop := BT_SCR_GETDESKTOPHANDLE()

   nDesktopWidth := GetDesktopWidth()
   nDesktopHeight := GetDesktopHeight()

   y := 90
   for i := 1 to 1000
      Win_1.Label_1.VALUE := { i, ") ", HMG_GetObjectCount()[1], HMG_GetObjectCount()[2], HMG_GetObjectCount()[3], " --- ", GetProcessMemoryInfo()[3]/1024/1024 }
      xSaveWindowByHandle ( hDesktop , strzero(i,4)  + '.' + 'jpg' , 0 , 0 , nDesktopWidth , nDesktopHeight )
      IF i % 50 == 0
         RELEASE MEMORY   // ADD
         cName := "Label_"+hb_ntos(i)
         @ y, 10 LABEL &cName OF Win_1 AUTOSIZE
         y = y + 30
         xValue := { i, ") ", HMG_GetObjectCount()[1], HMG_GetObjectCount()[2], HMG_GetObjectCount()[3], " --- ", GetProcessMemoryInfo()[3]/1024/1024 }
         SetProperty( "Win_1", cName, "VALUE", xValue )
      ENDIF
      DO EVENTS           // ADD
      hb_releaseCPU()     // ADD
   next i

   msginfo('fin')

return


*-----------------------------------------------------------------------------------*
FUNCTION xSaveWindowByHandle ( nHandle , cFileName , nRow , nCol , nWidth , nHeight )
*-----------------------------------------------------------------------------------*
LOCAL hBitmap

   hBitmap := xBT_BitmapCaptureClientArea ( nHandle , nRow, nCol, nWidth, nHeight)

   IF hBitmap <> 0

   IF   UPPER(RIGHT( cFileName , 4 ) ) == '.GIF'
         BT_BitmapSaveFile (hBitmap, cFileName , BT_FILEFORMAT_GIF )
   ELSEIF   UPPER(RIGHT( cFileName , 4 ) ) == '.JPG'
         BT_BitmapSaveFile (hBitmap, cFileName , BT_FILEFORMAT_JPG )
   ELSEIF   UPPER(RIGHT( cFileName , 4 ) ) == '.PNG'
         BT_BitmapSaveFile (hBitmap, cFileName , BT_FILEFORMAT_PNG )
   ELSEIF   UPPER(RIGHT( cFileName , 4 ) ) == '.BMP'
         BT_BitmapSaveFile (hBitmap, cFileName , BT_FILEFORMAT_BMP )
   ENDIF

   BT_BitmapRelease (hBitmap)

   ENDIF

RETURN hBitmap

Function xBT_BitmapCaptureClientArea ( nHandle , Row, Col, Width, Height)
   LOCAL New_hBitmap
   LOCAL Max_Width  := BT_ClientAreaWidth( nHandle )
   LOCAL Max_Height := BT_ClientAreaHeight( nHandle )
   bt_FillRectIsNIL (@Row, @Col, @Width, @Height, 0, 0, Max_Width, Max_Height)   
   bt_AdjustWidthHeightRect (Row, Col, @Width, @Height, Max_Width, Max_Height)      
   New_hBitmap := BT_BMP_CAPTURESCR ( nHandle , Col, Row, Width, Height, BT_BITMAP_CAPTURE_CLIENTAREA)
Return New_hBitmap
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
Roberto Lopez
HMG Founder
Posts: 3980
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 27 times
Been thanked: 168 times

Post by Roberto Lopez » Fri Sep 16, 2016 8:08 pm

srvet_claudio wrote:Hi Roberto,
try with this code, work fine for me in Win XP 32 bit.
I added the functions:
RELEASE MEMORY
DO EVENTS
hb_releaseCPU()
Sadly, the problem remains here (Windows 7 Pro 32 bits).

The program generates 467 images, being the last a black one.

I'm attaching the first image and the 466th.

I've changed the main window in the demo to topmost and shred the desktop between it and the task manager showing system memory usage.

Capture #1:
0001.jpg
0001.jpg (194.56 KiB) Viewed 2000 times
Capture #466:
0466.jpg
0466.jpg (205.4 KiB) Viewed 2000 times
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

KDJ
Posts: 238
Joined: Mon Sep 05, 2016 3:04 am
Location: Poland
Been thanked: 271 times

Post by KDJ » Fri Sep 16, 2016 9:05 pm

Dear Dr. Claudio Soto

I tested it in Win-XP, machine 1.5 GB memory.
Results:
- memory usage on program start: 4 MB,
- maximum memory usage during execution: 1200 MB,
- count of created files: 331,
- files from 1 to 330: good,
- file 331: bad (blank).

This problem is similar to that reported by mol here: viewtopic.php?f=43&t=4738&start=70#p46200
and I confirmed here: viewtopic.php?f=43&t=4738&start=70#p46338

User avatar
srvet_claudio
Posts: 2044
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 35 times
Been thanked: 148 times
Contact:

Post by srvet_claudio » Fri Sep 16, 2016 10:06 pm

It is a very strange problem because it works fine for me in Win 10 (64-bit) and in Win XP (32 bit), with add:
RELEASE MEMORY
DO EVENTS
hb_releaseCPU()
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

User avatar
Roberto Lopez
HMG Founder
Posts: 3980
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 27 times
Been thanked: 168 times

Post by Roberto Lopez » Fri Sep 16, 2016 10:37 pm

srvet_claudio wrote:It is a very strange problem because it works fine for me in Win 10 (64-bit) and in Win XP (32 bit), with add:
RELEASE MEMORY
DO EVENTS
hb_releaseCPU()
As I've already mentioned, I've attempted to use SaveWindowByHandle() function, present in older versions of HMG, with the same results (the app crash after certain number of generated files).

And.. I've just fixed!

SaveWindowByHandle used a bitmap that was not released.

I've simply added:

Code: Select all

DeleteObject ( hBitmap );
At the function end, and all works smoothly now.

Maybe the same problem in Bos Taurus (some bitmap not released)?... perhaps some temporary one intermediate work?
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
Roberto Lopez
HMG Founder
Posts: 3980
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 27 times
Been thanked: 168 times

Post by Roberto Lopez » Fri Sep 16, 2016 10:40 pm

And... regarding Windows 10... could be that some automatic memory release occurs under certain circumstances?
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
Roberto Lopez
HMG Founder
Posts: 3980
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 27 times
Been thanked: 168 times

Post by Roberto Lopez » Fri Sep 16, 2016 11:01 pm

Claudio:

A clue:

I've modified the test program to capture the desktop and then release the bitmap WITHOUT saving (not calling BT_BitmapSaveFile) and the memory consumption remained steady across 1000 iterations, so the problem is at saving (BT_BitmapSaveFile).
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
Roberto Lopez
HMG Founder
Posts: 3980
Joined: Wed Jul 30, 2008 6:43 pm
Has thanked: 27 times
Been thanked: 168 times

Post by Roberto Lopez » Fri Sep 16, 2016 11:10 pm

Another clue:

If in the original (unmodified) example, you change the file extension to '.bmp' all works fine.

So, the problem should be in bt_SaveGDIPlusPicture() used when type is not bmp.

Maybe, there is some memory used and not released there...
Regards/Saludos,

Roberto


(Veritas Filia Temporis)

User avatar
srvet_claudio
Posts: 2044
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Has thanked: 35 times
Been thanked: 148 times
Contact:

Post by srvet_claudio » Sat Sep 17, 2016 12:05 am

Roberto Lopez wrote:Another clue:

If in the original (unmodified) example, you change the file extension to '.bmp' all works fine.

So, the problem should be in bt_SaveGDIPlusPicture() used when type is not bmp.

Maybe, there is some memory used and not released there...
You are right is a very basic error.
I fixed,
please change the original bt_SaveGDIPlusPicture function in C:\hmg.3.4.3\SOURCE\c_BosTaurus.c (line 686) for this:
I forget to include: GlobalFree (hGlobalAlloc);

Code: Select all

BOOL bt_SaveGDIPlusPicture (HBITMAP hBitmap, TCHAR *FileName, INT TypePicture) 
{
   CLSID    encoderClsid;
   BOOL     result;
   IStream  *iStream;
   GpImage  *image;
   WCHAR    format [21];
   HGLOBAL  hGlobalAlloc;
   INT      ret1, ret2;      
   WCHAR    wFileName [MAX_PATH];
   
   switch (TypePicture)
   {
        case BT_FILEFORMAT_BMP:
             wcscpy (format, L"image/bmp");
             break;
        case BT_FILEFORMAT_JPG:
             wcscpy (format, L"image/jpeg");
             break;
        case BT_FILEFORMAT_GIF:
             wcscpy (format, L"image/gif");
             break;
        case BT_FILEFORMAT_TIF:
             wcscpy (format, L"image/tiff");
             break;
        case BT_FILEFORMAT_PNG:
             wcscpy (format, L"image/png");
             break;
        default:
             return FALSE;
   }
   
   if (bt_Load_GDIplus () == FALSE)
       return FALSE;
      
   result = bt_GetEncoderCLSID ((WCHAR *)format, &encoderClsid);

   if(result == TRUE)
   {
      hGlobalAlloc = bt_Bitmap_To_Stream (hBitmap);
      iStream = NULL;
      if (CreateStreamOnHGlobal (hGlobalAlloc, FALSE, &iStream) == S_OK)
      {   
          #ifdef UNICODE
              lstrcpy (wFileName, FileName);
          #else
              MultiByteToWideChar(CP_ACP, 0, FileName, -1, wFileName, MAX_PATH);
          #endif

          ret1 = GdipLoadImageFromStream(iStream, &image);
          ret2 = GdipSaveImageToFile(image, wFileName, &encoderClsid, NULL);   // Save the image 
          
          iStream->lpVtbl->Release (iStream);
          bt_Release_GDIplus ();
          
          GlobalFree (hGlobalAlloc);   // ADD, September 2016
          
          if (ret1 == 0 && ret2 == 0)
             return TRUE;
          else
             return FALSE;
      }
   } 
   bt_Release_GDIplus ();
   return FALSE; // The File encoder is not installed
}
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com

Post Reply