[VC++] API WIN32 : GESTION DE LA RAM EN PROGRESS BAR V 1.1

wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011 - 30 janv. 2006 à 16:33
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 10 août 2006 à 22:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35819-vc-api-win32-gestion-de-la-ram-en-progress-bar-v-1-1

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 août 2006 à 22:03
racpp > j'avais répondu sans vérifier et tu avais raison, encore une connerie du dernier VS car avant ce n'était pas le cas, le compilo mettait direct le code inline en asm.
Depuis VS 2005:
memset() place un appel au CRT et lie le prog au msvcrt8.dll, UNE HORREUR ABSOLUE.
ZeroMemory() est macro de RtlZeroMemory(), donc préférable mais on a tout de même un appel de fonction avec 2 PUSH, pas optimal.

On fait sa fonction perso:
__declspec(naked) void __fastcall bnzeromem(BYTE *pmem, DWORD count);
et sera le mieux je pense.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
5 févr. 2006 à 15:44
Version 2.0 ajouter au site !
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
5 févr. 2006 à 11:15
Merci du compliment :)
Cette apres midi, je l'update (Pas sur) avec une source faite avec RACPP,
avec :

Ram Max : 512
Ram Libre 132
Ram Occuper : ...
Pourcent : 41

et la progress bar :)
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
5 févr. 2006 à 09:43
Merci pour l'exe :-)
pratique comme programme, et merci pour cette source d'inspiration ;-)
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
2 févr. 2006 à 19:32
L'exe est supprimé du Zip et je n'ai pas accès à un compilo pour l'instant
Si possible le renommer (.exec ou autre) et réuploader ?
Merci ;-)
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 févr. 2006 à 18:21
Ok c'est noté. Merci.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 févr. 2006 à 18:13
ah non serait trop beau, le code est mis dans l'exe mais en une fonction (ici logique ok) mais hors CRT point de salut, il ne donne plus accès à ces fonctions.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 févr. 2006 à 17:35
Merci pour la précision.
C'est pareil pour itoa() ltoa() _itoa() etc?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 févr. 2006 à 17:32
ZeroMemory() est en macro dans VC++, un simple #define de memset() dont le code est mis inline direct en asm dans le code, donc kifkif.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 févr. 2006 à 16:51
Salut,
Je préfère toujours ZeroMemory() à memset() car cette dernière fait partie de la CRT. Qu'en pensez-vous?
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
2 févr. 2006 à 13:24
Je réclame mon dû comme dit dans mon horoscope :p lol
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 févr. 2006 à 13:16
ouh mille excuses M. l'ingénieux, je n'étais pas remonté assez haut dans les comments, alors on dira tous les 2.
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
2 févr. 2006 à 12:56
Expliquer par Joky tu voulais dire non ?
Joky l'ingénieur même à ce qui paraît
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 févr. 2006 à 12:53
Mais il ne peut y avoir de problème et encore moins de doute.
1 bit ne connaissant que 2 états et comme expliqué par racpp plus haut, la quantité est toujours une puissance de 2.
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
2 févr. 2006 à 12:47
Bon pour règler le problème :

http://www.adbdp.asso.fr/outils/infogenerale/octets.htm

voilà :D

++
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
2 févr. 2006 à 01:32
Salut,
Juste une précision:
1 Ko 1 x 1024 1024 octets = 2^10
1 Mo 1024 x 1024 1048576 octets = 2^20

Donc 1 Mo n'est pas égal à 1024 x 1000.
1024000 n'est pas une puissance de 2.
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
1 févr. 2006 à 16:29
J'suis pas ingénieur mais bon j'répond quand même ;)

Alors l'ordi ne parle qu'en base 2 ( 0 et 1 ), nous pour info on est en base 10 parce qu'on a 10 doigts :)
Donc, chaque bit possède une valeur 0 ou 1 mais comme c'est de l'électronique et que c'est abstrait le 0 ou 1, on peut assimilé la chose à quand c'est 0, pas de lumière, quand 1 y'a de la lumière :)

Maintenant si t'a un bit, t'as 2 possibilités 0 ou 1
Si t'as 2 bits t'as 4 possibilités 00 01 10 11 autrement dit 2^2
Si t'as 3 bits t'as 8 possibilités 000 001 010 011 100 101 110 111
etc...
1 octet c'est 8 bits -> 2^8 possibilités

Voilà pourquoi c'est des puissances de 2 :o
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 févr. 2006 à 15:01
win98 n'est plus pris en charge par personne.
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
1 févr. 2006 à 14:28
BRUNEWS : Je ne comprend pas alors, pourquoi le fait de faire ce genre de manip me libere d'un coup 450 Mo de ram ? c'est sur c'est mieux sous xp que sous 98 mais pas encore le top ...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 févr. 2006 à 14:20
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

HWND hmain;
HWND hprg, hinfo;
char szappname[] = "Rameur";

__declspec(naked) char* __fastcall bnultoa(unsigned int dwnum, char* szdst)
{ // ECX dwnum, EDX szdst
__asm {
or ecx, ecx
jnz short L1
lea eax, [edx+1]
mov byte ptr[edx], 48
mov byte ptr[eax], cl
ret 0
L1:
mov [esp-4], edi
mov [esp-8], edx
mov edi, edx
L2:
mov eax, -858993459
mul ecx
mov eax, edx
shr eax, 3
mov edx, ecx
lea ecx, [eax+eax*8]
add ecx, eax
sub edx, ecx
add dl, 48
mov [edi], dl
mov ecx, eax
inc edi
test eax, eax
jnz short L2
mov byte ptr[edi], al
mov [esp-12], edi
mov eax, [esp-8]
L3:
dec edi
mov dl, [eax]
mov cl, [edi]
mov [edi], dl
mov [eax], cl
inc eax
cmp eax, edi
jb short L3
mov eax, [esp-12]
mov edi, [esp-4]
ret 0
}
}

void __stdcall OnTimerRam()
{
MEMORYSTATUSEX mstt;
DWORD mem;
long color;
char buf[48], *c;
mstt.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&mstt);
mem = mstt.dwMemoryLoad;
if(mem < 41) color = RGB(23, 219, 38);
else if(mem > 81) color = RGB(255, 66, 66);
else color = RGB(255, 127, 0);
SendMessage(hprg, PBM_SETBARCOLOR, 0, color);
SendMessage(hprg, PBM_SETPOS, (WPARAM) mem, 0);
c = bnultoa(mem, buf);
strcpy(c, "% soit "); // 7 OCTETS DE PLUS, VOIR DESSOUS
c = bnultoa(mstt.ullAvailPhys, c + 7);
strcpy(c, " octets libres");
SetWindowText(hinfo, buf); // FINI SANS 1 SEUL strcat
}

LRESULT CALLBACK AppWndProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_TIMER:
OnTimerRam();
return 0;
case WM_CREATE:
hprg = CreateWindowEx(CS_DBLCLKS, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 30, 20, 218, 30, hwnd, 0, 0, 0);
SetTimer(hwnd,1,500,NULL);
hinfo = CreateWindowEx(0,"STATIC", 0, WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER, 10, 60, 255, 20,hwnd,0,0,0);
SendMessage(hprg, PBM_SETRANGE, 0, MAKELPARAM(0,100));
return 0;
case WM_DESTROY:
KillTimer(hwnd, 1);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, mssg, wParam, lParam);
}

DWORD __stdcall InitInstance(HINSTANCE hinst)
{
WNDCLASSEX wndcls;
INITCOMMONCONTROLSEX iccex;
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccex.dwICC = ICC_PROGRESS_CLASS;
if(!InitCommonControlsEx(&iccex)) return 0;
memset(&wndcls, 0, sizeof(WNDCLASSEX));
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.lpfnWndProc = AppWndProc;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.hInstance = hinst;
wndcls.lpszClassName = szappname;
wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(0, IDC_ARROW);
if(!RegisterClassEx(&wndcls)) return 0;
hmain = CreateWindowEx(WS_EX_TOPMOST, szappname, szappname, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 280, 120, 0, 0, hinst, 0);
return (hmain != 0);
}

#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) int __stdcall myWinMain()
{
__asm {
push 0
call dword ptr GetModuleHandle
push eax
call dword ptr InitInstance
lea ebp, [esp-28]
test eax, eax
je short progEXIT
mov esp, ebp
mov eax, hmain
mov esi, GetMessage
push SW_NORMAL
push eax
mov ebx, TranslateMessage
call dword ptr ShowWindow
mov edi, DispatchMessage
getMSG:
push 0
push 0
push 0
push ebp
call esi
test eax, eax
je short progEXIT
push ebp
call ebx
push ebp
call edi
jmp short getMSG
progEXIT:
push 0
call dword ptr ExitProcess
}
}
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 févr. 2006 à 13:51
Hors le commutateur 3G0, impossible sur win32 d'allouer + de 2 Go, faut-il encore déduire l'espace pris par ton prog. Les 2 autres Go du processus sont réservés aux modules système.
Je te rappelle que de tout faire swapper au système est une plaisanterie à ne pas faire.
Pourquoi mets-tu 4 STATIC quand 1 seul suffirait et économiserait 3 SetWindowText, il faut réduire au max le boulot d'un tel prog pour ne pas fausser les valeurs. A cet effet va prendre bnultoa dans mes sources, ça évitera tout chainage et tu mettras tout dans un buffer que tu plaqueras en 1 seul SetWindowText, ainsi 1 seule opération GDI sur le static.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
1 févr. 2006 à 12:58
tout voudrai dire
int i = malloc(1000000000000000000) et free (i) ?
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
1 févr. 2006 à 12:57
Si vous diviser les Octect Par 1024 Vous Obtiendrai des Ko et par 102400 de Mo et 102400000 de Go Etc....
Ps : une petite question pour un ingenieur :) pourquoi les Capacite RAM sont des Puissance de 2
2^2 = 8
Mais 2^10 1024 et 2^9 512
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
1 févr. 2006 à 12:50
Version 1.1 Release :)
merci mais la 1.2 arrive tres bientot d'ici 2 - 3 jours :)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 janv. 2006 à 17:33
A ne jamais faire, ça ralentit tout le système en l'obligeant à un swap disque.
Le memory manager depuis Win 2000 gère tout cela parfaitement, ce genre d'"utilitaire" est à reléguer aux oubliettes.
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
31 janv. 2006 à 17:24
Salut, pourquoi ne pas faire un défragmenteur de ram, d'apres ce que j'ai pus y reflechir, suffit de creer un pointeur énorme puis le deleter et d'admirer le travail. Rampage est sympa pour ça.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
31 janv. 2006 à 16:10
Merci :) je vais mettre a jour avec une fenetre reglo comme me la montrer BruNews, et du texte du genre :
"Vous utiliser 124/512 Mo de votre ram soit 32 %" ou quelque chose dans le genre :)

pour me mailer : Jean_guis@hotmail.com
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 janv. 2006 à 13:13
Salut,
Merci pour ce petit utilitaire. L'idée est excellente. Ca m'a fait savoir moi aussi que j'utilise toute ma RAM.
J'attends la mise à jour pour mettre une note.
Bonne continuation.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 21:04
Merci et bonne chance pour ton futur projet
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 janv. 2006 à 20:59
Désolé j'avais pas vu ...
J'ai mis 10 parce ton programme ma permis de voir que j'utilisais presque toute la RAM de mon PC.
Va faloir que je vire des programmmes qui tournent pour rien
De plus ta source va peut etre me servir pour un futur projet ...
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 20:54
ps ;) j'atten une petite note :)
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 20:53
je l'avai aussi mit !! regarder dans ma source en haut :)
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
30 janv. 2006 à 20:38
Et bien en faite, quand on regarde GlobalMemoryStatusEx sur msdn
On se rend vite compte que :

Requirements
Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
Server Requires Windows Server "Longhorn", Windows Server 2003, or Windows 2000 Server.

Donc ça implique que la fonction, n'est pas valable sous Win98
Et donc pour compiler, il faut définir la macro _WIN32_WINNT
qui se trouve dans WinBase.h je pense voilà pourquoi c'est nécessaire :o
spiky31 Messages postés 106 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 11 février 2008
30 janv. 2006 à 20:34
Juste une question pour BruNews
A quoi sert le #define _WIN32_WINNT 0x0501 ?
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 20:29
si si je t'assure ! pour les progress bar :) tu m'avais aider sur le forum :)
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
30 janv. 2006 à 19:51
Moi j'ai aidé personne mais bon de rien ;) lol
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 19:28
Merci :) Je vais mettre a jour la source sur ce model :) et encore bravo a Jocky qui a eu ses exams, enfin du moins les partielles
merci beaucoup de votre aide a tout les 2 :)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2006 à 19:07
La même chose en plus propre, manque les textes sur la fenêtre, pas vraiment indispensable.
Note qu'il ne reste qu'une struct MSG dans WinMain, ça évite de gréver la stack inutilement. En mettant le reste dans InitInstance() le pointeur de pile est remonté illico en sortie.
J'ai rajouté le style TOPMOST, utile pour ce genre de prog, supprimé le bouton maximize car inutile ici.
Timer et progressbar initialisés au bon endroit, WM_CREATE.

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

HWND hmain;
HWND hprg;
char szappname[] = "Rameur";

void __stdcall OnTimerRam()
{
MEMORYSTATUSEX mstt;
DWORD mem;
long color;
mstt.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&mstt);
mem = mstt.dwMemoryLoad;
if(mem < 41) color = RGB(23, 219, 38);
else if(mem > 81) color = RGB(255, 66, 66);
else color = RGB(255, 127, 0);
SendMessage(hprg, PBM_SETBARCOLOR, 0, color);
SendMessage(hprg, PBM_SETPOS, (WPARAM) mem, 0);
}

LRESULT CALLBACK AppWndProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_TIMER:
OnTimerRam();
return 0;
case WM_CREATE:
hprg = CreateWindowEx(CS_DBLCLKS, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 30, 20, 218, 30, hwnd, 0, 0, 0);
SetTimer(hwnd,1,500,NULL);
SendMessage(hprg, PBM_SETRANGE, 0, MAKELPARAM(0,100));
return 0;
case WM_DESTROY:
KillTimer(hwnd, 1);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, mssg, wParam, lParam);
}

DWORD __stdcall InitInstance(HINSTANCE hinst)
{
WNDCLASSEX wndcls;
INITCOMMONCONTROLSEX iccex;
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccex.dwICC = ICC_PROGRESS_CLASS;
if(!InitCommonControlsEx(&iccex)) return 0;
memset(&wndcls, 0, sizeof(WNDCLASSEX));
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.lpfnWndProc = AppWndProc;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.hInstance = hinst;
wndcls.lpszClassName = szappname;
wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(0, IDC_ARROW);
if(!RegisterClassEx(&wndcls)) return 0;
hmain = CreateWindowEx(WS_EX_TOPMOST, szappname, szappname, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 280, 100, 0, 0, hinst, 0);
return (hmain != 0);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
MSG msg;
if(!InitInstance(hInstance)) return 0;
ShowWindow(hmain, SW_NORMAL);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

Mets à jour ta source sur ce modèle.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2006 à 17:43
Le SetTimer() est bizzarement placé dans WinMain, doit se mettre dans le WM_CREATE et détruit à la fermeture de la fenêtre.

Un prog Win GUI, pas besoin de stdio.h ni de string.h, windows.h suffit.
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
30 janv. 2006 à 17:37
C'est bizarre j'vois pas de SetTimer :s
Pourtant tu utilises le message WM_TIMER :o

;)Et ta barre elle est trop grosse lol :p
On sait que tu en rêves depuis lontemp mais bon quand même ! Pas devant tout le monde :o
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2006 à 17:31
Hors l'EXE, tout ce qui est dans le dossier RELEASE est à virer, souviens toi pour la prochaine source.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
30 janv. 2006 à 16:33
Merci beaucoup de laisser un petit commentaire :)*
PS : C'est la version 1.0, je cherche pour l'ameliorer la conversion de DWLONG vers LCPSTR !

Merci
et ne metter pas de mauvaise note sans expliquer pourquoi ?