Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C#2010] BeginInvoke blocca completamente l'interfaccia

    Ciao a tutti
    dopo aver letto tonnellate e tonnellate di pagine e forum online mi ritrovo a chiedere qui aiuto ai miei problemi, il forum di html.it ultimo baluardo delle mie speranze xD

    Vi espongo la situazione, sperando di stuzzicarvi un po'. Dispongo di...
    - Un form "padre" e dei form "figli"
    - Un oggetto che, alla ricezione dei dati da un dispositivo su porta COM, scatena degli eventi (in base ai dati ricevuti).
    - Delle funzioni delegate opportunamente associate agli eventi di cui sopra.

    Quello che sto cercando di fare è di interrogare il dispositivo chiedendogli l'ID. Il protocollo di comunicazione funziona ed i dati transitano sempre nel modo opportuno. Il delegato che si occupa di aggiornare l'etichetta corrispondente all'ID in uno dei form figli di cui sopra controlla se il thread che vuole modificare l'elemento è quello che ha generato l'elemento oppure no: nel caso in cui non lo fosse (ed ovviamente, non lo sarà) l'elemento da modificare invocherà una nuova istanza del delegato mediante la funzione "BeginInvoke".

    La funzione viene quindi richiamata nuovamente e... l'interfaccia si pianta. Perdo ogni controllo sul form padre e su tutti i figli. Le ho provate TUTTE, anche forzando la chiusura del metodo BeginInvoke tramite EndInvoke passandogli l'opportuna variabile di stato di tipo IAsyncRes, ma non ottengo un risultato differente.

    Ho notato (durante un po' di debug) che, facendo apparire una messageBox in una parte del programma i dati sull'interfaccia me li aggiorna (quindi di fatto il delegato esegue il suo compito) ma comunque l'interfaccia si pianta in maniera irremovibile.

    Come posso risolvere? Spero in una vostra cortese risposta. Ringrazio in anticipo chiunque si dedichi alla risoluzione di questo problema.

    Di seguito vi posto il codice della funzione delegata...

    codice:
    /* updateDtReleaseEVentArgs è un oggetto che estende EventArgs, per permettere lo scambio dati. Al suo interno contiene la definizione dell'Handler, messa li per una mera questione di comodità... */
    
    public void updateDtRelease(Object sender, updateDtReleaseEventArgs args)
            {
    // Nell'if ci entra alla prima invocazione, poichè il thread è differente da quello che ha creato l'etichetta lbl_deviceModel_val
    
                if (lbl_deviceModel_val.InvokeRequired)
                {
                    lbl_deviceModel_val.BeginInvoke
                    (
                        new updateDtReleaseEventArgs.updateDtReleaseEventHandler(this.updateDtRelease),
                        new Object[] { sender, args }
                    );
                }
    // Qui ci entra invece alla seconda invocazione, quando è la stessa etichetta ad invocare il delegato
    
                else
                {
                    lbl_deviceModel_val.Text = args.modelID + " v" + args.modelRev;
                }
            }

  2. #2
    Tanto per aggiornare la situazione, ora sembra che nell'else del delegato non mi ci entri proprio... ed ovviamente, continua ad inchiodarsi

    EDIT: mi sono reso conto che tutto funziona regolarmente. Il problema è causato da altre funzioni, che evidentemente riempono le pile del form. Si può chiudere, ringrazio tutti coloro che hanno letto il messaggio nel tentativo di offrire il loro contributo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.