Avec les MFC nous avons deux sortes de threads qui puissent �tre cr�es :
A. Les threads de travail sont ceux qui g�n�ralement ne n�cessitent aucune interaction directe avec les �l�ments de l'I.H.M (Objets fen�tres, bo�tes de dialogues, contr�les, etc...). Ce genre de thread servent souvent � faire des traitements ou calculs relativement longs et � retourner leur r�sultat au thread principale. La communication entre le thread principale et les thread de travail se font soit par partage des objets globaux tels que des objets de synchronisations ou par des messages utilisateurs windows. Ces threads l� sont parfois utiles pour �viter de figer le thread principale et de permettre � l'utilisateur d'avoir la main (souris) libre sur l'IHM de l'application.
B. Les threads d'interface utilisateur sont ceux qui poss�dent leurs propres pompes � messages et donc permettent de g�rer les messages windows au m�me titre que le thread principal o� l'emploie de tous les objets MFC tels que les documents, les vues, les frames, les boites de dialogues, les contr�les etc... sont permis contrairement au thread de travail o� certaines concessions doivent �tre fa�tes.
Pour cr�er un thread UI:
1. Vous devez ajouter une classe application ou une classe de thread c'est � dire un CWinThread dans votre projet pour le nouveau thread.
Ici l'id�e est que chaque thread UI poss�de :
- son objet application (objet Win Thread),
- sa pompe � message et
- sa fen�tre windows principale qui lui est propre.
Vous retiendrez au fait que votre CWinApp de toujours n'est qu'un CWinThread pour lequel les assistants code initialise correctement le thread principale pour vous.
Donc vous vous retrouvez avec votre application MFC avec au moins deux t�tes c'est � dire deux objets applications ou objets win thread.
2. Chaque objet application n�cessite qu'il soit initialis� � partir de sa m�thode virtuelle InitInstance(). C'est ce que fa�t g�n�ralement votre thread principal. Bien entendu vous nettoyez votre thread UI dans ExitInstance().
3. Vous n'oubliez pas non plus � indiquez � votre objet win thread dans son InitInstance() �a fen�tre principale.
4. Quelques parts dans votre code vous lancer votre thread UI en transmettant � AfxBeginThread le runtime class de votre CWinThread.
5. Pour fermer votre thread UI vous fermez simplement sa fen�tre principale de la m�me mani�re que vous mettez fin � votre thread principale. C'est � dire que le thread UI recoit un WM_QUIT qui lui permet de sortir de sa boucle de messages dans CWinThread::Run().
Bon un peu de code :
La classe du Win thread que j'ajoute au projet
J'initialise mon objet win thread
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #pragma once // CMyUIThread est la classe de mon objet win thread class CMyUIThread : public CWinThread { DECLARE_DYNCREATE(CMyUIThread) protected: CMyUIThread(); // protected constructor used by dynamic creation virtual ~CMyUIThread(); public: virtual BOOL InitInstance(); virtual int ExitInstance(); protected: DECLARE_MESSAGE_MAP() };
Noter que la fen�tre principale de votre UI Thread peut �tre une frame enti�re o� vous utilisez votre mod�le document-vues et le tout dans un thread.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 BOOL CMyUIThread::InitInstance() { // TODO: perform and per-thread initialization here // la boite de dialogue "A propos" est la fenêtre principale de mon UI thread CAboutDlg dlg; m_pMainWnd = &dlg; // j'indique à mon objet la fenêtre principale dlg.DoModal(); // bon j'affiche. return TRUE; }
A partir d'une commande de menu je lance mon UI Thread o� je transmet non pas une fonction globale ni une m�thode statique mais le runtime class de mon CWinThread � AfxBeginThread().
A partir de cet exemple c'est comme si on a une application dialog based (dans le UI Thread) � l'int�rieur d'une application MDI (le thread principale).
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 void CMainFrame::OnUiThread() { // TODO: Add your command handler code here CWinThread* pUIThread = AfxBeginThread(RUNTIME_CLASS(CMyUIThread)); // je peux stocker mon pUIThread si je veux intéragir directement par programmation avec mon UI Thread en faisant par exemple un CWinThread::PostThreadMessage() }
Et donc deux mod�les de programmation MFC dans un seul projet.
Voil�![]()
Partager