Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Le notifiche sui cambiamenti dei file in Windows (2/3)
Scritto da Vincenzo Lo Cicero il 05-11-2007 ore 10:27
L’esempio allegato contiene un’applicazione MFC, che mostra l’utilizzo delle API descritte nell’articolo precedente. Si tratta di una Dialog che consente di visualizzare un file di testo all’interno di una edit-box multiline. Una volta aperto il file, possiamo provare a modificarlo con un’altra applicazione, per esempio Blocco Note. Salvando il file su Blocco Note, la nostra applicazione riceve la notifica del cambiamento e chiede se si intende ricaricare il file.

Dopo l’apertura del file, chiamiamo la funzione FindFirstChangeNotification e memorizziamo l’handle restituito in una variabile membro della classe, m_hChange. Subito dopo avviamo il thread, che si metterà in attesa di eventuali cambiamenti al nostro file:
  1. <span style="font-size:1.0em">
  2. // Funzione Thread
  3. UINT ThreadFunc(LPVOID pParam)
  4. {
  5. 	THREADPARMS* ptp = (THREADPARMS*) pParam;
  6. 	HWND hWnd = ptp->hWnd;
  7. 	HANDLE hChange = ptp->hChange;
  8.  
  9. 	delete ptp;
  10.  
  11. 	if ( hChange == INVALID_HANDLE_VALUE )
  12. 	{
  13. 		return -1;
  14. 	}
  15.  
  16. 	while ( 1 )
  17. 	{
  18. 		::WaitForSingleObject(hChange, INFINITE);
  19. 		::SendMessage(hWnd, WM_USER_FILE_MODIFIED, (WPARAM)0, (LPARAM)0);
  20. 		::FindNextChangeNotification(hChange);
  21. 	}
  22.  
  23.     return 0;
  24. }
  25. </span>
Per attendere che un oggetto kernel diventi segnalato, si usa la funzione WaitForSingleObject:
  1. <span style="font-size:1.0em">
  2. DWORD WaitForSingleObject( 
  3. HANDLE hHandle, 
  4. DWORD dwMilliseconds );
  5. </span>
Il primo parametro è un handle di un oggetto kernel; nel nostro caso, si tratta di un oggetto di notifica dei cambiamenti sui file. Il secondo parametro dice al sistema per quanto tempo (in millisecondi) vogliamo attendere. Noi abbiamo utilizzato il valore INFINITE e, dunque, attendiamo finché l’oggetto non diventi segnalato. Se si vuole specificare un tempo massimo di attesa, la funzione va chiamata nel modo seguente :
  1. <span style="font-size:1.0em">
  2. WaitForSingleObject(hChange, 10000); // Attendiamo per max dieci secondi
  3. </span>
In questo caso, se l’oggetto non diventa segnalato entro dieci secondi, il sistema sveglia il thread e gli consente di proseguire l’esecuzione. WaitForSingleObject restituisce uno dei seguenti valori:
  • WAIT_OBJET_0: l’oggetto ha raggiunto lo stato segnalato;
  • WAIT_TIMEOUT: l’oggetto non ha raggiunto lo stato segnalato entro il tempo specificato nel parametro dwMilliseconds;
  • WAIT_ABANDONED: l’oggetto mutex ha raggiunto lo stato segnalato in seguito al suo abbandono;
  • WAIT_FAILED: si è verificato un errore.
Precedente: Rails Recipes
Successiva: MySQL 5 Guida Completa
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.255 secondi.