Results 1 to 15 of 15

Thread: [VB.NET/C#] Gestione thread

  1. #1
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default [VB.NET/C#] Gestione thread

    Dopo la fantastica scorsa puntata sull'override non potete perdervi questa sulla mitica gestione dei thread... :P

    Il mio problema è questo: ho un thread che gestisce il "main" e un thread che gestisce il polling di alcuni dati su un PLC. Quando la funzione che esegue il polling pesca dei nuovi dati genera un evento che viene gestito dal main. Funziona tutto correttamente, ma mi sono accorto che la sub che gestisce l'evento generato dalla funzione di polling viene eseguita sul thread del polling anzichè su quello del main.
    Giusto per darvi qualche info in più:
    - la funzione che gestisce il polling è un metodo di una classe "PLC" che viene istanziata nel main
    -il thread del polling viene creato dalla classe "PLC" quando viene istanziato il primo oggetto (primo e unico :P )
    - la sub che gestisce l'evento denerato dall'oggetto "PLC" fa parte del main

    Come faccio a far gestire l'evento generato dalthread del main anzichè dal thread del polling?

    Probabilmente sono stato poco chiaro quindi chiedetemi pure più info
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  2. #2
    Lieutenant Commander Rayvaughan's Avatar
    Join Date
    Mar 2005
    Location
    45.663989,8.783906
    Posts
    17.274

    Default

    con un bel monitor

  3. #3
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Rayvaughan View Post
    con un bel monitor
    e dove dovrei metterlo? sulla sub che gestisce l'evento nel main? explain
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  4. #4
    Lieutenant Commander Rayvaughan's Avatar
    Join Date
    Mar 2005
    Location
    45.663989,8.783906
    Posts
    17.274

    Default

    sì a naso lo metterei nel main

  5. #5
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    ho dato un'occhiata in giro e non credo che il monitor possa aiutarmi, infatti non devo sincronizzare l'accesso a dati condivisi :/ Di fatto il mio NON è un problema di sincronizzazione: ho solo bisogno che un evento generato da un thread sia gestito da "un altro" thread già attivo
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  6. #6

  7. #7
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    ok a prima vista sembra quello che cerco. ora gli do una lettura, se è troppo sbatti da implemetare lo lascio così però tanto funziona, era solo una mia sega mentale
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  8. #8
    Hador's Avatar
    Join Date
    Mar 2004
    Location
    Milano
    Posts
    31.321

    Default

    patterns 101

  9. #9
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Hador View Post
    patterns 101
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  10. #10
    Lieutenant
    Join Date
    Feb 2004
    Location
    Bresso
    Posts
    4.683

    Default

    Ma anche se implementi l'Observer quando fai la chiamata del metodo dell'observer non la esegue sul main thread.
    A che ti serve poi che venga eseguito dal main thread?

    Il metodo che mi viene in mente e' di creare una Window e usare la sua pompa di messaggi, ma devi scrivere un sacco di codice per fare sta roba.
    Oppure se l'applicazione e' grafica ci sono modi semplici per fare eseguire codice nel thread della UI (Invoke/BeginInvoke o usare il Dispatcher in WPF).

  11. #11
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    Quote Originally Posted by Kat View Post
    Ma anche se implementi l'Observer quando fai la chiamata del metodo dell'observer non la esegue sul main thread.
    A che ti serve poi che venga eseguito dal main thread?.
    voglio che venga eseguita dal main thread anzichè da quello del polling perchè sennò il polling viene "ritardato" (ok è una cosa altamente trascurabile, ma non è "formalmente" corretto)

    Quote Originally Posted by Kat View Post
    Il metodo che mi viene in mente e' di creare una Window e usare la sua pompa di messaggi, ma devi scrivere un sacco di codice per fare sta roba.
    Oppure se l'applicazione e' grafica ci sono modi semplici per fare eseguire codice nel thread della UI (Invoke/BeginInvoke o usare il Dispatcher in WPF).
    sisi è un'applicazione grafica, vedo un po' quello che mi hai suggerito
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  12. #12
    Hador's Avatar
    Join Date
    Mar 2004
    Location
    Milano
    Posts
    31.321

    Default

    ma infatti non dicevo di farlo dal main ma da farlo da un oggetto apposta

  13. #13
    Lieutenant
    Join Date
    Feb 2004
    Location
    Bresso
    Posts
    4.683

    Default

    Quote Originally Posted by Eltarion View Post
    voglio che venga eseguita dal main thread anzichè da quello del polling perchè sennò il polling viene "ritardato" (ok è una cosa altamente trascurabile, ma non è "formalmente" corretto)
    Allora basta usare il threadpool e farlo eseguire in modo asincrono con BeginInvoke con un delegate.

    Edit: per intenderci una cosa del tipo:

    public delegate void PiripicchioDelegate(object arg);

    e nel metodo dove devi eseguire la procedura:

    PiripicchioDelegate del=new PiripicchioDelegate(FunzioneCheAgisce);
    del.BeginInvoke(arg, null, null);

    il codice dentro il metodo FunzioneCheAgisce viene eseguito in un thread a parte del threadpool.
    Volendo se fa poca roba il codice da eseguire lo puoi pure mettere inline con una lambda expression:
    PiripicchioDelegate del= (arg) => { ...codice... };
    Last edited by Kat; 14th June 2010 at 20:20.

  14. #14
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    ok mi avete dato da studiare per una settimana :P

    ora abbiamo:

    observer istanzato sul thread del main VS delegate

    vedremo chi vincerà
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

  15. #15
    Lieutenant Junior Grade Eltarion's Avatar
    Join Date
    Dec 2004
    Location
    Venaria
    Posts
    4.085

    Default

    sei dei nabbi! bastava usare una mailbox al posto dell'evento
    Realm Of Trollers
    while ( ! ( succeed = try() ) );
    Spoiler

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 103.81 Kb. compressed to 88.65 Kb. by saving 15.17 Kb. (14.61%)]