thread: sleep vs suspend

  1. 3 months ago

    Ho diversi threads che condivdono delle variabili tra di loro attraverso delle funzioni. Tutte queste funzioni ovviamente utilizzano l' oggetto critical section per gestire l' accesso alle risorse (variabili).
    Tutto funziona bene fintanto che:

    • solo i threads usano le funzioni
    • un solo thread condivide le funzioni con un timer che visualizza i dati sulla windows principale.

    I problemi cominciano quando più threads condividono le funzioni con un timer per la visualizzazione.

    Indagando nel progetto ho notato che se il timer attiva una chiamata ad una funzione mentre il thread è in "sleep" quest' ultimo va in stato "waiting" come se fosse in attesa del comando leave della critical section.

    Per ovviare al problema ho creato una funzione che blocca il thread con il comando suspend e poi avvia un timer che esegue il comando resume.

    con questo sistema non ho più avuto problemi di blocco dei thread (waiting)

    Che differenza ho dunque tra sleep e suspend ?
    É un problema dovuto al codice gestito dal timer ?

  2. Maurizio R

    Dec 12 Pre-Release Testers, Xojo Pro

    L'evento Action del timer viene generato nel thread principale quindi non viene eseguito nel contesto di altri threads.
    Non ho compreso come l'applicaizone sia organizzata ma se, da come mi sembra di aver capito, un thread si sospende con una criticalsection acquisita sicuramente il tutto non funziona.
    La criticalsection deve essere acquisita per il tempo necessario all'accesso alla variabile e rilasciata subito dopo: qualsiasi altro concatenamento di eventi durante l'acquisizione della critical section deve essere assolutamente evitato.

  3. Ti ringrazio Maurizio per la risposta, ma siccome la gestione dei threads è articolata e richiede molte informazioni, qui di seguito ci sono i link delle le due versioni

    Test con thread messo in sospensione tramite il comando Sleep

    link 1

    Test con il comando suspend ed il timer per il comando"resume"

    link 2

    'Nel progetto con il comando sleep, il timer "updatedataclock" contiene il commento dove la funzione esegue l' aggiornamento della windows solo se il thread non è in "sleep"

    È una settimana che provo e riprovo ma non riesco a capire perchè il programma si comporta in questo modo.

    Forse con altri occhi....

or Sign Up to reply!