Problemi con API win32

di il
5 risposte

Problemi con API win32

Sale a tutti,
sono nuovo di questo forum spero percio' di non essere entrato nella sezione sbagliata.
Sto scrivendo un programma in C dove utilizzo la API di win32 ReadDirectoryChangesW() per tenere sotto controllo il cambiamento dei files in una directory specifica. Riesco a farla funzionare bene in modo sincrono, ora vorrei farla anche funzionare in modo asincrono cioe' vorrei, oltre a tenere sotto controllo la variazione dei file anche sospendere momentaneamete questa funzione per svuotare il buffer dove sono depositati i cambiamenti. Sulla documentazione "msn2.microsoft.." dice di usare una struttura di overlap, ma non avendo trovato alcun esempio in merito non riesco a trovare la soluzione. Ho creato e riempito la struttura di overlap, ho creato l'evento, che dovrebbe sospendere la ReadDirectoryChangesW() al pari di una variazione di file, ma non funziona correttamente perche' mettendo il pointer nel campo lpOverpapped di ReadDirectoryChangesW() la funzione ritorna sempre anche se l'evento non si e' verificato.
Potreste indicarmi dove sto sbagliando oppure dove posso trovare documentazione che tratta di questa API con un esempio asincrono.
Vi ringrazio e saluto

5 Risposte

  • Re: Problemi con API win32

    Ciao,

    Che metodo usi per ricevere la notifica del completamento asincrono? La GetOverlappedResult, la GetQueuedCompletionStatus o passi un puntatore alla completion routine? Se hai creato un evento unico mi pare di capire che stai cercando di usare la prima delle tre...

    L'handle alla directory, inoltre, lo ottieni in maniera corretta con la CreateFile? Ricorda di specificare il FILE_FLAG_OVERLAPPED tra i flag.

    La ReadDirectoryChanges ritorna sempre e comunque... la ricezione delle informazioni al cambiamento sono demandati ad uno dei metodi che ti ho menzionato (ovviamente, se la ReadDirectoryChanges non ritornasse subito non sarebbe più una cosa asincrona). Durante una fase di polling dovrai usare la GetOverlappedResult e controllarne il risultato (in caso di un'operazione in corso di esecuzione, otterrai FALSE e un ERROR_IO_PENDING in GetLastError, altrimenti ottieni TRUE). Quando la GetOverlappedResult ha terminato, i dati dovrebbero essere disponibili nel buffer...

    Ciaociao
  • Re: Problemi con API win32

    Il FLAG_FILE_OVERLAPPED lo specifico nella createfile(). in realta' io devo uscire dalla ReadDirectoryChangesW() sia quando cambia un file nella directory sia ogni 10 secondi, quindi ho creato un evento "non segnalato" con la CreateEvent() nel campo hEvent della struttura OVERLAPPED che poi passo alla ReadDirectoryChangesW(). Un altro Thread funge da timer che dopo 10 secondi setta l'evento a "segnalato".
    A questo punto la ReadDirectoryChangesW(), che dovrebbe essere bloccata (invece continua a ritornare all'interno del ciclo while), dovrebbe ritornare e riconoscere il motivo per il quale e' uscita.
    Non so ancora quale dei metodi asincroni utilizzare e se ho stravolto il senso di "asincrono".
    Come posso realizzare una cosa del genere?
  • Re: Problemi con API win32

    Ciao,

    Ho l'impressione non tanto che tu abbia stravolto il senso di asincrono, quanto che tu abbia interpretato male il funzionamento della ReadDirectoryChanges quando si fornisce un overlapped ed un evento...

    La funzione parte e termina immediatamente. Per controllare se/quando l'operazione è effettivamente terminata dovrai usare la GetOverlappedResult. Tale funzione imposterà l'evento a signaled quando ha terminato l'operazione di scansione. NB: L'evento deve essere auto-reset e bisogna fare attenzione a gestirlo in caso si passi bWait=true, pena la possibilità di deadlock...

    L'operazione diventa asincrona nel senso che il programma continua la sua esecuzione dopo la ReadDirectoryChanges ed il termine dell'operazione di scansione viene invece determinato dalla GetOverlappedResult (in un' altro thread apposito o una funzione di polling). Qualcosa del tipo:

    ReadDirChanges...
    while(...)
    {
    ... operazioni varie
    if(GetOverlappedResult)... fai qualcosa tipo aggiornare lo schermo...
    }

    Ciaociao
  • Re: Problemi con API win32

    Ok grazie,
    mi sembra di aver capito ti faro' sapere gli sviluppi.

    Ciao
  • Re: Problemi con API win32

    Ok bottomap
    dopo due giorni di prove sembra che ora tutto funzioni al meglio, ti ringrazio per i suggerimenti fornitimi
    ByBy
Devi accedere o registrarti per scrivere nel forum
5 risposte