Thread et IHM

jamais34 Messages postés 10 Date d'inscription vendredi 8 juillet 2005 Statut Membre Dernière intervention 3 octobre 2007 - 2 oct. 2007 à 17:57
jamais34 Messages postés 10 Date d'inscription vendredi 8 juillet 2005 Statut Membre Dernière intervention 3 octobre 2007 - 3 oct. 2007 à 19:30
Bonjour,
j'ai une classe qui implemente ses différentes interfaces :
class ATL_NO_VTABLE CPropPage :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPropPage, &CLSID_PropPage>,
    public IPropertyPageImpl<CPropPage>,
    public CDialogImpl<CPropPage>

dans une des fonctions de cette classe je veux gérer une barre de progression. Pour celà je dois utiliser les threads car sinon l'IHM ne se met pas à jour.

J'ai donc créé une classe qui dérive de CWinThread et utilisé la fonction AfxBeginThread comme suit pour lancer le thread  :
UIThreaded* pUIThreaded = (UIThreaded*)AfxBeginThread(
   RUNTIME_CLASS(UIThreaded),
   THREAD_PRIORITY_ABOVE_NORMAL, 0,
   CREATE_SUSPENDED);
pUIThreaded->ResumeThread();

Jusqu'ici tout va bien, les fonctions InitInstance, ExitInstance, ... de la classe UIThreaded sont bien appellée. Maintenant ce que je voudrais faire s'est modifier l'IHM. En d'autre mots, récupérer l'object ProgressBar et en modifier les paramètres.
Est ce quelqu'un sait comment réaliser cela ?
Je suis aussi ouvert à l'utilisation d'une autre méthode pour gérer l'IHM à partir d'un thread.
Merci.

3 réponses

The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
2 oct. 2007 à 20:12
Bonjour,

tu as plusieurs moyens pour passer la ProgressBar, mais le plus utilisé dans les modèles objets c'est de la passer en paramètre au constructeur de ton objet
il faudra faire attention à ne pas avoir deux Threads différents qui modifient le même objet par contre (la ProgressBar en l'occurrence)
ça va si un affiche et un modifie si deux modifient ça va plus.. ( sans conviction )

=

Une autruche ne se cuit pas aux petits lardons
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
2 oct. 2007 à 22:27
Par expérience je te déconseil de gérer la partie IHM dans un thread.
Privilègie plutot les evenements (cf PostMessage ou SendMessage).

Shell
0
jamais34 Messages postés 10 Date d'inscription vendredi 8 juillet 2005 Statut Membre Dernière intervention 3 octobre 2007
3 oct. 2007 à 19:30
Alors,
j'ai finalement utilisé la fonction AfxBeginThread avec un prototype de ce type
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

j'ai modifié le constructeur de la classe passée comme premier paramètre pour avoir accès à la progress bar.
En effet dans la fonction (par exemple) InitInstance de ma classe de type CWinThread, j'arrive à gérer la barre de progression.

Là ou ca se complique, c'est au moment de l'exécution. Je remarque en observant l'IHM, que la modification de celle ci se fait seulement après que le thread principal ait fini son travail.
Par exemple un des boutons de l'IHM reste en position enfoncé tant que le code du thread principal n'a pas été éxecuté.
Pourtant je suis sur que le second thread fonctione car j'ai pu en vérifier le fonctionnement à l'aide de MessageBox.

Je tiens à préciser que je suis en train de développer une dll qui modifie l'interface graphique d'un logiciel (ETS3-KONNEX), outre cela la DLL doit aussi lancer du code qui gérer certainnes API de communication avec un bus bifilaire.
Ce code ne peut fonctionner que dans le thread principal, d'où l'impossibilité d'utiliser un thread de travail. Voir le prototype ci dessous.

CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

D'autres bonnes suggestions ?
0
Rejoignez-nous