-
Thread et IHM
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.
-
News.
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
);
C'est si difficile que ca à faire ?