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

    [C#] Evento aperto in un thread separato, errore quando viene rialzato!

    Ehilà
    Piccoli quesiti che google fatica a rispondere (sopratutto se non sai quello che cerchi esattamente).

    Ho un Evento scritto da me, e utilizzato in un thread separato.. piccola preview della classe JoyInput (classe custom per gestire il joystick):

    codice:
    public delegate void gestoreButtonReleased(object sorgente, int button);
    
    Class JoyInput
    {
      public void joystart() {
        //dichiarazione dei controlli input
    
        //eseguo un while infinito su un thread separato per attendere una pressione del bottone
        Thread t = new Thread(new ThreadStart(this.WaitForInput));
        t.Name = "JoyInput Thread";
        t.Start();
      }
    
      //Evento pubblico
      public event gestoreButtonReleased OnButtonReleased;
    
      //metodo eseguito su un altro thread
      private WaitForInput() {
        //condizioni varie
     
       //se la pressione è true
       OnButtonReleased(this, i);
    
      }
    
    }
    ok fin qua ho tutto quello che mi serve.. alla pressione del bottone rialza l'evento se sottoscritto. Andiamo nella window principale ora
    codice:
    // codice codice
    public void funzionex
    {
      //Dichiaro il joypad
      JoyInput joy = new JoyInput();
      joy.joystart();
    
      //sottoscrivo l'evento alla pressione del bottone
      joy.OnButtonReleased += new gestoreButtonReleased(joy_OnButtonReleased);
    }
    
    private void joy_OnButtonReleased(object sorgente, int button)
    {
        EseguiStopPlay();
    }
    
    private void EseguiStopPlay()
    {
      //azioni varie sui controlli
    }
    Mi riporta errore dentro il metodo EseguiStopPlay:
    Informazioni aggiuntive: Impossibile accedere all'oggetto dal thread chiamante perché tale oggetto è di proprietà di un altro thread.

    Infatti il problema è che EseguiStopPlay viene eseguito sul thread separato, non su quello principale.. come fare?

  2. #2
    Risolto il problema.

    E' bastato dichiarare un delegate.invoke sulla main window. Ci avevo provato ma non trovava il metodo invoke.. dopo ho capito tramite altri esempi che l'utilizzo corretto nelle wpf è:

    codice:
    public delegate void nomedelegate();
    
    this.Dispatcher.Invoke(new nomedelegate(nomefunzione));

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.