Programant Fils (Tema 3)
per Jordi Binefa
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è?