by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 2007
-
17 sept. 2006 à 20:24
by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 2007
-
18 sept. 2006 à 17:47
Bonsoir!
J'aurais une petite question! J'ai créé un programme qui pendant un certain temps gère des caractères et les modifie, pour du cryptage. Donc pendant ce temps la, j'ai placé une barre de progression. Pour la modification des caractères, ca donne un peu près ca, en language courant:
while(!feof(fichier)
{
//Ici, je lis les caractères et les modifies, le code n'est pas important, je ne le met pas...
Avec bien sur un incrémentation à chaque fois pour le pourcentage... Le problème c'est que pendant ce temps, si je passe une autre fenêtre par dessus, toute mon application est gelé, et on ne voit plus rien, je ne sait donc pas comment mettre à jour. J'ai essayé simplement avec UpdateWindow, mais ça ne marchait pas très bien, et ça prennait plus de temps qu'autre chose. Est-ce que quelqu'un aurait une solution à mon problème?
Ensuite, 2ème simple petite question, tout cela se fais dans une procédure de boite de dialogue, et à partir de cette procédure je lance une nouvelle boite de dialogue où il y a ma barre de progression.
En gros ça donne ça:
MainWindow
|_____________> hDlg1--> Modification des caractère
|________>hDlg2--->Barre de progression
Donc comment faire pour que lorsque la boite de dialogue 2 est ouverte, on ne puisse pas "activer" la première boite de dialogue? Enfin comme pour la boite de dialogue 1 par rapport à la fenêtre principale... J'espère que c'est clair!
Merci à ceux qui veulent bien m'aider
by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 20071 18 sept. 2006 à 09:41
Alors j'ai en quelques sortes résolu le deuxième problème, mais quoique... Etant donné que mes dialogbox étaient déjà modales, j'ai placé 2-3 EnableWindow.. Mais je vais encore voir. Mais le problème revient au même, c'est toujours pour mettre à jour l'affichage de mon programme pendant l'encryptage.. Je ne sais pas si tu as répondu à cela BruNews, en parlant de procédure longue et de thread, peux-tu m'en dire un peu plus?
Merci
by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 20071 18 sept. 2006 à 10:42
Merci c'est gentil, j'ai déjà réussi à créer un petit peu, en ayant ma procédure de boite de dialogue, qui appelle un thread.
Dans la procédure du thread, il y a ceci:
//cryptage de mes caractères..... et mise à jour de la progress_bar
return 0;
Et je suis sur que le programme s'execute jusqu'à l'affichage de la progress_bar, au début, mais ne va pas plus loin. Comment cela se fait-il? Doit je récupérer des messages quelques part? Genre avec GetMessage()? Serait-il possible d'avoir un petit peu d'aide complémentaire vite dit...
Merci bien
Vous n’avez pas trouvé la réponse que vous recherchez ?
by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 20071 18 sept. 2006 à 10:55
Je tiens juste à clarifier un tout petit peu les choses, car je vois que ce n'est pas clair du tout...
Voila mon code en un peu plus clair:
//voilà la boite de dialogue sur laquelle la progressbar s'affiche
BOOL APIENTRY Dialog3Proc(HWND hDlg3,UINT uMsg2,WPARAM wParam,LPARAM lParam)
{
switch (uMsg2)
{
case WM_INITDIALOG:
//SetWindowText(hDlg3,"salut");
EnableWindow(hDlg2,FALSE);//fenêtre depuis la quelle on affiche la boite de dialogue contenant la progress_bar
EnableWindow(hwnd2,FALSE);
InitCommonControls();
progress_bar = CreateWindow(
PROGRESS_CLASS,
(LPSTR) NULL,
WS_CHILD|WS_VISIBLE|PBS_SMOOTH,
5, 10, 345,25,
hDlg3,
(HMENU)ID_PROGRESS1,
hinstance2,
NULL);
ShowWindow(progress_bar,SW_SHOWNORMAL);
SetTimer(hDlg3,1,0,0);
return FALSE;
case WM_TIMER:
KillTimer(hDlg3,1);
hThread=CreateThread('\0','\0',ThreadProc,'\0','\0',&ThreadId);
Voila! Donc enfait, depuis mon dernier message, j'ai fait quelques modification, et maintenant ça marche, sauf que c'est extrêment lent, et que la ligne tout à la fin EndDialog(hDlg3,0); n'agit pas.. J'entends par la, que la boite de dialogue(hDlg3) contenant la progress_bar ne se ferme pas :S
Voila j'ai essayé d'être le plus clair possible, ça serait gentil d'obtenir un petit peu d'aider :O
Merci d'avance
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 18 sept. 2006 à 11:08
Beaucoup trop le souk:
- Pourquoi un timer ?
- Que fait InitCommonControls() ici, se met au debut de WinMain.
- Mets la progressbar avec def de la dialog dans le fichier rc.
by_rabbit_08
Messages postés109Date d'inscriptionvendredi 8 avril 2005StatutMembreDernière intervention15 mai 20071 18 sept. 2006 à 11:43
Ben le timer, c'est pour que la progress_bar s'affiche dès le lancement de la dialogbox, c'est quelqu'un sur le forum qui me l'avait conseillé!
InitCommonControls(), je l'ai placé au début de mon programme néanhmoins ca ne change rien. Et la progressbar, pourquoi est-ce que je devrait la déclarer en fichier rc? Je la créer avec CreateWindow, jusque la ça allait bien! :O C'est la aussi quelqu'un du forum qui me la conseillé... Mais si c'est indispensable, dis le moi!
Mais au pire de la lenteur, je m'en fiche, j'aimerais juste savoir comment faire pour que mon EndDialog(hDlg3,0) à la fin de mon programme fonctionne et que la boite de dialogue qui contient la progressbar se ferme... Est-ce que c'est possible, vu comme j'ai fais les choses?
Merci
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 18 sept. 2006 à 17:21
La création des controles est au bas mot 200 fois plus rapide si tout est en ressource plutot qu'a coup de CreateWindow.
Je fais donc le cas que tout est défini dans le rc.
DWORD WINAPI ThreadProc(LPVOID pparam)
{
// BOULOT DU THREAD ICI
// HWND PROGRESSBAR DANS pparam POUR LA MANIPULER
// ABSOLUMENT SORTIR A LA LIGNE DESSOUS QUOI QU'IL ARRRIVE
thrdExit:
PostMessage(GetParent((HWND) pparam), THRD_END, 0, 0);
return 0;
}
INT_PTR CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_INITDIALOG:
SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
// ON LANCE THREAD EN LAISSANT AFFICHAGE SE FAIRE (return 1)
PostMessage(hdlg, THRD_INIT, 0, 0);
return 1;
case THRD_INIT:
hthread = CreateThread(0, 0, ThreadProc, (LPVOID) hPrgrss, 0, 0);
break;
case THRD_END:
CloseHandle(hthread); hthread = 0;
// AUTRES TRUCS SI BESOIN
break;
case WM_COMMAND:
switch(wParam) {
case IDCANCEL:
if(!hthread) EndDialog(hdlg, 0);
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
InitCommonControls();
DialogBoxParam(hInstance, (LPCTSTR)IDD_APP, 0, AppDlgProc, 0);
return 0;
}