Programant Fils (Tema 3)

per Jordi Binefa

http://www.binefa.net

 

 

Creem una aplicació senzilla MFC AppWizard (exe) :

Step 1: Single document

Step 2: Default settings

Step 3: Default settings

Step 4: Turn off all options

Step 5: Default settings

Step 6: Default settings

 

Afegir a l’arxiu de capçalera de la classe vista, just abans de la declaració de la classe, aquest missatge de Windows definit per l’usuari :

 

const WM_FIL_ACABAT = WM_USER + 100;

 

Afegeix aquesta nova funció membre a la classe vista :

 

 

Omplir aquesta funció amb :

 

    MessageBox("Fil acabat.");
    return 0;

 

A sota de //}}AFX_MSG_MAP i a sobre de END_MESSAGE_MAP() incloure :

 

            ON_MESSAGE(WM_FIL_ACABAT, OnFilAcaba)

 

Això relacionarà el missatge de Windows, WM_FIL_ACABAT, generat per nosaltres amb la funció OnFilAcaba que és membre de la classe vista. Fixa-t’hi que tan sols posem el nom de la funció i que ON_MESSAGE(...) no acaba amb ;

 

Per començar el fil ho farem prement el botó esquerra del ratolí. Cridarem l’assistent de classes ClassWizard (Ctrl + w):

 

 

Editarem el codi i sota // TODO: Add your message handler code here and/or call default farem una crida per a que comenci el fil :

 

            controladorDeFil = 1;

            HWND hWnd = GetSafeHwnd();

            AfxBeginThread(RutinaFil, hWnd, THREAD_PRIORITY_NORMAL);

 

Afegirem la rutina del fil sota els includes i defines del document .cpp de la classe vista :

 

volatile int controladorDeFil;

 

UINT RutinaFil(LPVOID param){

    ::MessageBox((HWND)param, "Fil activat.", "Fil", MB_OK);

                           while (controladorDeFil == 1);

    ::PostMessage((HWND)param, WM_FIL_ACABAT, 0, 0);

    return 0;

}

Fixa’t que PostMessage envia el missatge WM_FIL_ACABAT que és recollit per ON_MESSAGE(WM_FIL_ACABAT, OnFilAcaba) i executa la funció OnFilAcaba que es membre de la classe vista.

 

Per acabar el fil ho farem prement el botó esquerra del ratolí. Cridarem l’assistent de classes ClassWizard (Ctrl + w):

 

 

Editarem el codi i sota // TODO: Add your message handler code here and/or call default farem una crida per a que comenci el fil :

 

            controladorDeFil = 0;

 

Prova de començar quatre cops el fil (prement el botó esquerra del ratolí) i després atura’l (amb el botó dret del ratolí). Que succeeix i perquè?

 

 

Fils003.zip