Página 1 de 1

Datos de la memoria y datos del disco

Publicado: Lun Jul 24, 2006 7:45 pm
por jrcpoli
Saludos:
En la aplicación que estoy pasado del sistema anterior a Xailer tenía en
una pantalla de información del tipo acerca de... una serie de datos de
información sobre la memoria y capacidad del disco donde se está ejecutando
la aplicación, algunas cosas ya las modificado pero tengo dos cosas que no
he podido hacerlas y otra la he hecho pero me gustaría saber si es correcto
lo que he realizado.
1º.- Memoria libre : ¿Es correcto esto que hecho?
#include "hbmemory.ch"
** Memoria libre
nMemoriaLibre := Memory(HB_MEM_RUN) // Da KB.
2º.- Recursos del sistema : Esto no sé si existe alguna función
especifica, se que en la API de Windows se puede obtener con
GlobalMemoryStatus(dwMemoryLoad), pero como implementarla a mi no me ha
salido hay por medio una estructura de datos MEMORYSTATUS la cantidad que
sale son el tanto por ciento de recursos libres del sistema por lo tanto
sale maximo 100.
3º.- Capacidad Total del disco donde se está ejecutando la aplicación.
4º.- Capacidad Libre esta es facil puesto que hay una función
especifica.
Gracias anticipadas.
José Ramón Castro Polinio.

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 11:55 am
por jfgimenez
José,
> 1º.- Memoria libre : ¿Es correcto esto que hecho?
>
> #include "hbmemory.ch"
>
> ** Memoria libre
> nMemoriaLibre := Memory(HB_MEM_RUN) // Da KB.
No creo que sea correcto. La memoria en windows es un recurso dinámico, es
decir, windows da o quita memoria a cada proceso en función de las
necesidades concretas de cada momento. Y eso hablando de memoria física,
porque en realidad un programa podría solicitar un bloque de memoria de 2GB
y windows se lo da, aunque físicamente el ordenador tenga sólo 256MB
> 2º.- Recursos del sistema : Esto no sé si existe alguna función
> especifica, se que en la API de Windows se puede obtener con
> GlobalMemoryStatus(dwMemoryLoad), pero como implementarla a mi no me ha
> salido hay por medio una estructura de datos MEMORYSTATUS la cantidad que
> sale son el tanto por ciento de recursos libres del sistema por lo tanto
> sale maximo 100.
En win32, que yo sepa, no hay una forma fiable de conocer los recursos
usados/libres del SO
> 3º.- Capacidad Total del disco donde se está ejecutando la aplicación.
>
> 4º.- Capacidad Libre esta es facil puesto que hay una función
> especifica.
Para ambas puedes usar la función del API GetDiskFreeSpace()
--
Un saludo,
José F. Giménez
http://www.xailer.com

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 2:19 pm
por jrcpoli
Saludos:
Para poder utilizar las funciones de la API de Windows como debo
implementarlas en xHabourd, he visto por ahí esto:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
/*
BOOL CopyFile(
LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);
Esta es información es del API y no coincide con el prototipado que estabas
haciendo
*/
XA_FUNC(APICOPYFILE)
{
hb_retl( CopyFile( hb_parc( 1 ), hb_parc( 2 ), FALSE )
}
#pragma ENDDUMP
En mi caso como implementaria GetDiskFreeSpace()
Teniendo en cuenta que la API de Windows contiene la siguiente información:
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // address of root path
LPDWORD lpSectorsPerCluster, // address of sectors per cluster
LPDWORD lpBytesPerSector, // address of bytes per sector
LPDWORD lpNumberOfFreeClusters, // address of number of free clusters
LPDWORD lpTotalNumberOfClusters // address of total number of clusters
);
Y que a mí mi interesa el valor de lpRootPathName, y como sería
posteriormente la llamada desde Xailer.
Haber si con este ejemplo puedo coger de una vez la implementación en
xhabourd de las llamadas a la API y su forma de utilizarlas posteriormente.
Gracias anticipadas.
José Ramón Castro Polinio.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=44c5eaa2@news.xailer.com...]44c5eaa2@news.xailer.com...[/email]
> José,
>
>> 1º.- Memoria libre : ¿Es correcto esto que hecho?
>>
>> #include "hbmemory.ch"
>>
>> ** Memoria libre
>> nMemoriaLibre := Memory(HB_MEM_RUN) // Da KB.
>
> No creo que sea correcto. La memoria en windows es un recurso dinámico, es
> decir, windows da o quita memoria a cada proceso en función de las
> necesidades concretas de cada momento. Y eso hablando de memoria física,
> porque en realidad un programa podría solicitar un bloque de memoria de
> 2GB
> y windows se lo da, aunque físicamente el ordenador tenga sólo 256MB
>
>
>> 2º.- Recursos del sistema : Esto no sé si existe alguna función
>> especifica, se que en la API de Windows se puede obtener con
>> GlobalMemoryStatus(dwMemoryLoad), pero como implementarla a mi no me ha
>> salido hay por medio una estructura de datos MEMORYSTATUS la cantidad que
>> sale son el tanto por ciento de recursos libres del sistema por lo tanto
>> sale maximo 100.
>
> En win32, que yo sepa, no hay una forma fiable de conocer los recursos
> usados/libres del SO
>
>
>> 3º.- Capacidad Total del disco donde se está ejecutando la aplicación.
>>
>> 4º.- Capacidad Libre esta es facil puesto que hay una función
>> especifica.
>
> Para ambas puedes usar la función del API GetDiskFreeSpace()
>
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 5:06 pm
por jfgimenez
José Ramón,
> En mi caso como implementaria GetDiskFreeSpace()
>
> Teniendo en cuenta que la API de Windows contiene la siguiente
> información:
>
> BOOL GetDiskFreeSpace(
> LPCTSTR lpRootPathName, // address of root path
> LPDWORD lpSectorsPerCluster, // address of sectors per cluster
> LPDWORD lpBytesPerSector, // address of bytes per sector
> LPDWORD lpNumberOfFreeClusters, // address of number of free clusters
> LPDWORD lpTotalNumberOfClusters // address of total number of clusters
> );
>
> Y que a mí mi interesa el valor de lpRootPathName, y como sería
> posteriormente la llamada desde Xailer.
>
> Haber si con este ejemplo puedo coger de una vez la implementación en
> xhabourd de las llamadas a la API y su forma de utilizarlas
> posteriormente.
Te la escribo al vuelo (no está probada):
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
XA_FUNC( GETDISKFREESPACE )
{
DWORD lpSectorsPerCluster; // address of sectors per cluster
DWORD lpBytesPerSector; // address of bytes per sector
DWORD lpNumberOfFreeClusters; // address of number of free clusters
DWORD lpTotalNumberOfClusters; // address of total number of clusters
hb_retl( GetDiskFreeSpace( hb_parc( 1 ), &lpSectorsPerCluster,
&lpBytesPerSector,
&lpNumberOfFreeClusters,
&lpTotalNumberOfClusters ) );
hb_stornl( lpSectorsPerCluster, 1 );
hb_stornl( lpBytesPerSector, 2 );
hb_stornl( lpNumberOfFreeClusters, 3 );
hb_stornl( lpTotalNumberOfClusters, 4 );
}
#pragma ENDDUMP
Por cierto, si metes la rutina en un fichero .c en vez de .prg, las líneas
#pragma NO tienes que ponerlas.
--
Un saludo,
José F. Giménez
http://www.xailer.com

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 5:28 pm
por jrcpoli
Saludos:
Dos cosas primero en mi ignorancia creo que falta lpRootPathName en la
implementación, dime si es correcto lo que digo o estoy equivocado.
Segundo te preguntaba el mi anterior cuestión, ¿Como realizaba
posteriormente la llamada desde Xailer?
Gracias.
José Ramón Castro Polinio
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:44c6338e$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> José Ramón,
>
>> En mi caso como implementaria GetDiskFreeSpace()
>>
>> Teniendo en cuenta que la API de Windows contiene la siguiente
>> información:
>>
>> BOOL GetDiskFreeSpace(
>> LPCTSTR lpRootPathName, // address of root path
>> LPDWORD lpSectorsPerCluster, // address of sectors per cluster
>> LPDWORD lpBytesPerSector, // address of bytes per sector
>> LPDWORD lpNumberOfFreeClusters, // address of number of free clusters
>> LPDWORD lpTotalNumberOfClusters // address of total number of
>> clusters
>> );
>>
>> Y que a mí mi interesa el valor de lpRootPathName, y como sería
>> posteriormente la llamada desde Xailer.
>>
>> Haber si con este ejemplo puedo coger de una vez la implementación en
>> xhabourd de las llamadas a la API y su forma de utilizarlas
>> posteriormente.
>
> Te la escribo al vuelo (no está probada):
>
> #pragma BEGINDUMP
> #include <windows.h>
> #include <xailer.h>
>
> XA_FUNC( GETDISKFREESPACE )
> {
> DWORD lpSectorsPerCluster; // address of sectors per cluster
> DWORD lpBytesPerSector; // address of bytes per sector
> DWORD lpNumberOfFreeClusters; // address of number of free clusters
> DWORD lpTotalNumberOfClusters; // address of total number of clusters
>
> hb_retl( GetDiskFreeSpace( hb_parc( 1 ), &lpSectorsPerCluster,
> &lpBytesPerSector,
> &lpNumberOfFreeClusters,
> &lpTotalNumberOfClusters ) );
> hb_stornl( lpSectorsPerCluster, 1 );
> hb_stornl( lpBytesPerSector, 2 );
> hb_stornl( lpNumberOfFreeClusters, 3 );
> hb_stornl( lpTotalNumberOfClusters, 4 );
> }
>
> #pragma ENDDUMP
>
> Por cierto, si metes la rutina en un fichero .c en vez de .prg, las líneas
> #pragma NO tienes que ponerlas.
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 5:43 pm
por jfgimenez
José Ramón,
> Dos cosas primero en mi ignorancia creo que falta lpRootPathName en la
> implementación, dime si es correcto lo que digo o estoy equivocado.
No, no falta. Es el parámetro hb_parc( 1 )
> Segundo te preguntaba el mi anterior cuestión, ¿Como realizaba
> posteriormente la llamada desde Xailer?
FUNCTION EspacioLibreEnC()
LOCAL nSectoresPorCluster, nBytesPorSector, nClustersLibres,
nClustersTotal
IF GetDiskFreeSpace( "C:", @nSectoresPorCluster, @nBytesPorSector,
@nClustersLibres, @nClustersTotal )
RETURN nSectoresPorCluster * nBytesPorSector * nClustersLibres
ENDIF
RETURN 0
--
Un saludo,
José F. Giménez
http://www.xailer.com

Datos de la memoria y datos del disco

Publicado: Mar Jul 25, 2006 6:51 pm
por jrcpoli
Gracias Jose F. Gimenez, lo pruebo y te cuento cual es el resultado, aunque
seguro que es el que espero.
José Ramón Castro Polinio.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=44c63c15@news.xailer.com...]44c63c15@news.xailer.com...[/email]
> José Ramón,
>
>> Dos cosas primero en mi ignorancia creo que falta lpRootPathName en la
>> implementación, dime si es correcto lo que digo o estoy equivocado.
>
> No, no falta. Es el parámetro hb_parc( 1 )
>
>
>> Segundo te preguntaba el mi anterior cuestión, ¿Como realizaba
>> posteriormente la llamada desde Xailer?
>
> FUNCTION EspacioLibreEnC()
>
> LOCAL nSectoresPorCluster, nBytesPorSector, nClustersLibres,
> nClustersTotal
>
> IF GetDiskFreeSpace( "C:", @nSectoresPorCluster, @nBytesPorSector,
> @nClustersLibres, @nClustersTotal )
> RETURN nSectoresPorCluster * nBytesPorSector * nClustersLibres
> ENDIF
>
> RETURN 0
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>
>

Datos de la memoria y datos del disco

Publicado: Jue Jul 27, 2006 12:37 pm
por jrcpoli
Jose F.
Debo estar haciendo algo mal, porque las cantidades que me dá la función
no se ajustan a la realidad, y además si a la función le sustituyo el tercer
parametro por el cuarto me dá un error como paramentro NIL.
Haber si alguno prueba y me dice si a él le da correcto o en realidad es
que hay algún error.
No tengo prisa porque no es una cosa prioritaría del programa.
José Ramón Castro Polinio.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:[email=44c63c15@news.xailer.com...]44c63c15@news.xailer.com...[/email]
> José Ramón,
>
>> Dos cosas primero en mi ignorancia creo que falta lpRootPathName en la
>> implementación, dime si es correcto lo que digo o estoy equivocado.
>
> No, no falta. Es el parámetro hb_parc( 1 )
>
>
>> Segundo te preguntaba el mi anterior cuestión, ¿Como realizaba
>> posteriormente la llamada desde Xailer?
>
> FUNCTION EspacioLibreEnC()
>
> LOCAL nSectoresPorCluster, nBytesPorSector, nClustersLibres,
> nClustersTotal
>
> IF GetDiskFreeSpace( "C:", @nSectoresPorCluster, @nBytesPorSector,
> @nClustersLibres, @nClustersTotal )
> RETURN nSectoresPorCluster * nBytesPorSector * nClustersLibres
> ENDIF
>
> RETURN 0
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>
>

Datos de la memoria y datos del disco

Publicado: Jue Jul 27, 2006 1:26 pm
por jfgimenez
José Ramón,
> Debo estar haciendo algo mal, porque las cantidades que me dá la
> función
> no se ajustan a la realidad, y además si a la función le sustituyo el
> tercer
> parametro por el cuarto me dá un error como paramentro NIL.
Tienes razón, hay un error en el retorno de parámetros. Cambia:
hb_stornl( lpSectorsPerCluster, 1 );
hb_stornl( lpBytesPerSector, 2 );
hb_stornl( lpNumberOfFreeClusters, 3 );
hb_stornl( lpTotalNumberOfClusters, 4 );
por:
hb_stornl( lpSectorsPerCluster, 2 );
hb_stornl( lpBytesPerSector, 3 );
hb_stornl( lpNumberOfFreeClusters, 4 );
hb_stornl( lpTotalNumberOfClusters, 5 );
--
Un saludo,
José F. Giménez
http://www.xailer.com

Datos de la memoria y datos del disco

Publicado: Jue Jul 27, 2006 2:12 pm
por jrcpoli
Jose F.
Ahora perfecto muchas gracias.
José Ramón Castro Polinio.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje
news:44c8a2d7$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> José Ramón,
>
>> Debo estar haciendo algo mal, porque las cantidades que me dá la
>> función
>> no se ajustan a la realidad, y además si a la función le sustituyo el
>> tercer
>> parametro por el cuarto me dá un error como paramentro NIL.
>
> Tienes razón, hay un error en el retorno de parámetros. Cambia:
>
> hb_stornl( lpSectorsPerCluster, 1 );
> hb_stornl( lpBytesPerSector, 2 );
> hb_stornl( lpNumberOfFreeClusters, 3 );
> hb_stornl( lpTotalNumberOfClusters, 4 );
>
> por:
>
> hb_stornl( lpSectorsPerCluster, 2 );
> hb_stornl( lpBytesPerSector, 3 );
> hb_stornl( lpNumberOfFreeClusters, 4 );
> hb_stornl( lpTotalNumberOfClusters, 5 );
>
>
> --
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
>
>