Lancer un CDialog sans bloquer [Résolu]

perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention - 28 juil. 2006 à 17:56 - Dernière réponse : perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention
- 1 août 2006 à 10:58
Bonjour,


C'est encore moi :oD


voila, j'utilise C++(MFC) (pour ceux qui ne le savent pas encore :o)


et je souhaiterais pouvoir lancer une fenetre (un CDialog par exemple) mais sans bloquer mon application!
Car je connais doModal mais ca me bloque mon appli tant que le CDialog n'est pas refermé :(

Exist'il un autre moyen pour lancer un CDialog?

Merci!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 29 juil. 2006 à 16:27
3
Merci
Salut,

D'apres msdn, ca se fait avec Create().

Merci cs_aardman 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_aardman
Meilleure réponse
BunoCS 14175 Messages postés lundi 11 juillet 2005Date d'inscription 18 octobre 2018 Dernière intervention - 31 juil. 2006 à 09:11
3
Merci
d'un Create(), oui, suivi d'un ShowWindow() quand même...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage

Merci BunoCS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de BunoCS
Meilleure réponse
BunoCS 14175 Messages postés lundi 11 juillet 2005Date d'inscription 18 octobre 2018 Dernière intervention - 31 juil. 2006 à 11:58
3
Merci
Pour le signe "Pour cent", c'est normal: il faut le doubler: %% (même raison que pour '\' et '\\')

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage

Merci BunoCS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de BunoCS
perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention - 31 juil. 2006 à 10:25
0
Merci
Merci,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>


J'ai tout de même cherché une petite heure pourquoi mon create ne marchait pas lol


Il faut en effet un



ShowWindow(SW_SHOW)





Par contre autre question pour le même truc :


J'ouvre donc ma fenêtre. Cette fenêtre (DialogProgress) comprend le pourcentage d’avancement de qqch (avec un affichage texte et une barre de progress).



 




Maintenant j’ai une fonction qui est longue a s'exécuter et qui appel donc une callback pour pouvoir donner l'état d'avancement.
Cette Callback met à jour un champ de mon DialogProgress (ca marche) mais j'ai juste ce champ de visible (tout le reste de ma fenêtre est grise comme figée)


Savez vous pourquoi ? Je dois faire un rafraichissement complet de ma fenêtre à chaque appel ?



 





Un peut de code pour une explication peut-être plus claire :




En globale :







Include ‘ProgressDlg.h’







ProgressDlg DialogProgress ;







 







Dans le même fichier : (la fonction call back qui est bien appelée et qui marche très bien)







     
BOOL WINAPI ProgressFunc(UINT Percent,CINEHANDLE CH)







{








            Progress.Update(Percent);








           
return TRUE;







}







 







Toujours dans le même fichier dans le code :







DialogProgress.Create(IDD_Progress,this);








      DialogProgress.ShowWindow(SW_SHOW);








      StructDeSave->SaveCine(ProgressFunc);








      DialogProgress.OnCancel();







 







Dans ProgresDlg.h :






   class

ProgressDlg : public CDialog







   {








      DECLARE_DYNAMIC(ProgressDlg)








 







   public
:








      ProgressDlg(CWnd* pParent = NULL);   // standard constructor








     
virtual ~ProgressDlg();







   // Dialog Data








     
enum { IDD = IDD_Progress };








     










 







   protected
:








     
virtual
void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support








 








      DECLARE_MESSAGE_MAP()








 







   public
:








     
void Update(UINT Percent);








     
void OnCancel(void);







   };







 







Et dans ProgressDlg.cpp







// ProgressDlg.cpp : implementation file







//








 






   #include

"stdafx.h"







   #include
"RdvPhantom.h"







   #include
"ProgressDlg.h"







// ProgressDlg dialog








 







   IMPLEMENT_DYNAMIC(ProgressDlg, CDialog)







   ProgressDlg::ProgressDlg(CWnd* pParent /*=NULL*/)








      : CDialog(ProgressDlg::IDD, pParent)







   {







   }








 







   ProgressDlg::~ProgressDlg()







   {







   }








 







   void
ProgressDlg::DoDataExchange(CDataExchange* pDX)







   {








         CDialog::DoDataExchange(pDX);





   }








 








 







   BEGIN_MESSAGE_MAP(ProgressDlg, CDialog)







   END_MESSAGE_MAP()








 







   void
ProgressDlg::Update(UINT Percent)







   {








        CString CStringTemps;








      CStringTemps.Format("%u%",Percent);








      SetDlgItemText(IDC_Value,CStringTemps);







   }   







   void
ProgressDlg::OnCancel()







   {








      CDialog::OnCancel();







   }



Une idée de pourquoi ca fige? Et une solution surtout (si possible) lol

Merci!!!
---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
Commenter la réponse de perig
BunoCS 14175 Messages postés lundi 11 juillet 2005Date d'inscription 18 octobre 2018 Dernière intervention - 31 juil. 2006 à 11:01
0
Merci
Il faut, je pense, forcer le rafraichissement avec la fonction Invalidate();

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention - 31 juil. 2006 à 11:24
0
Merci
Nop, ca change rien, j'obtiens :  (seulement le chiffre, meme pas le signe %"

Aulieu de  : (avec Avancement =x%)

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
Commenter la réponse de perig
perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention - 1 août 2006 à 09:54
0
Merci
Pour le % j'avais essayé le\ mais je n’avais pas pensé à doubler le signe ;)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>


Par contre mon interface fige toujours, j'ai essayé de mettre ma fonction SaveCine (celle qui bouffe les ressources) dans un thread et donc mon callback est appelé a partir de ce thread et il met a jour mon dialog mais j'ai toujours le même problème, voir même... ca ne marche pas à tout les coups, parfois ca fige carrément tout Windows et un ctrl+alt+sup est nécessaire pour tuer la tache!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
Commenter la réponse de perig
perig 358 Messages postés vendredi 1 novembre 2002Date d'inscription 5 septembre 2006 Dernière intervention - 1 août 2006 à 10:58
0
Merci
Finalement j'ai trouvé une solution (pas très propre a mon gout mais ca marche)
C'est que la fonctions dans la quelle je fessais la création de ma fenêtre ne rendait pas la main tant que le thread était actif et visiblement ca figer le prog

Je lance donc ma DialogProgresse puis je lance mon thread en lui passant un pointeur de cette Dialog.


Ma fonction qui lance tout ceci se termine alors et le thread continue son travail
il lance la fonction bloquante qui elle même appelle couramment la callback pour témoigner de l'avancement via la Dialog box.


A la fin du thread celui-ci ferme et détruit simplement la DialogProgress.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Voila ce qui me gène c’est que la destruction de mon tread est finalement pas synchronisé avec mon prog principal mais bon… ce n’est pas trop gênant !


Merci de ton aide, je devrais pouvoir m'entirer maintenant!

---Perig---
Pour vous servir 
Et parfois en galère 
Souvent même
Commenter la réponse de perig

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.