2014-12-18 19 views
5

Sto scrivendo un programma C# per visualizzare la temperatura della CPU/GPU dalla mia PS3. C'è un pulsante di connessione. Funziona davvero bene e mi mostra la Temp. dalla mia CPU/GPU della mia PS3.La variabile C# non verrà aggiornata

Ora ho implementato un pulsante, che avvia un timer per ogni x secondi per farlo "refresh":

public void get_psdata() 
     { 
      //Get data from PS3 
      cputemp = PS3.GetTemperatureCELL(); 
      gputemp = PS3.GetTemperatureRSX(); 
      psversion = PS3.GetFirmwareVersion(); 
      psversiontype = PS3.GetFirmwareType(); 

      //Set data into Var 
      L_cputemp_show.Text = cputemp; 
      L_gputemp_show.Text = gputemp; 
      L_firmware_show.Text = psversion; 
      L_type_show.Text = psversiontype; 

      //Update Label 
      L_cputemp_show.Refresh(); 
     } 

Quindi questo "get_psdata" funziona solo sulla prima volta, quando si preme il pulsante di connessione. (Il pulsante di connessione inizia direttamente la funzione "get_psdate", mentre il pulsante di aggiornamento fa un po 'diverso, come è possibile vedere in seguito ...)

ecco il codice per eseguire il get_psdata:

//B_connect, Connect Button 
     private void b_connect_Click(object sender, EventArgs e) 
     { 
      //Connect CCAPI to PS3 if Button clicked 
      PS3.ConnectTarget(psip); 

      //Check Connection 
      if (PS3.SUCCESS(PS3.ConnectTarget(psip))) 
      { 
       //Show Status 
       MessageBox.Show("Connected to: " + psip + "!"); 
       this.L_status_show.Text = "Connected!"; L_status_show.ForeColor = System.Drawing.Color.Green; 

       //Call Function 
       get_psdata(); 
      } 
      else 
      { 
       //Show Status 
       MessageBox.Show("Failed to Connect to: " + psip + "!"); 
       this.L_status_show.Text = "Not Connected!"; L_status_show.ForeColor = System.Drawing.Color.Red; 
      } 
     } 

per il test, ho aggiunto un Messagebox.Show alla funzione "get_psdata" per vedere se funziona tutti i secondi x ... Sì lo fa e questo è il mio timer:

 //Function to set refresh delay 
     public void refresh_delay() 
     { 
      MessageBox.Show("Delay set to " + refresh_int + " Seconds!"); 
      refresh_int = refresh_int * 1000; //Change to Miliseconds 
      init_timer(); 
     } 
     //Timer 
     public Timer timer1; 
     public void init_timer() 
     { 
      timer1 = new Timer(); 
      timer1.Tick += new EventHandler(timer1_Tick); 
      timer1.Interval = refresh_int; // in miliseconds 
      timer1.Start(); 
     } 
     public void timer1_Tick(object sender, EventArgs e) 
     { 
      get_psdata(); 
     } 

e questo è ciò che si avvia il mio timer:

//B_set, Set refresh time button 
    private void B_set_Click(object sender, EventArgs e) 
    { 
     //Check refresh Value 
     refresh_string = TB_refresh.Text; 

     //Check empty 
     if (refresh_string != "") 
     { 
      //Check minimum 
      refresh_int = Convert.ToInt32(TB_refresh.Text); 
      if (refresh_int < 5) 
      { 
       DialogResult confirm = MessageBox.Show("This is not the delay you are looking for! \r (I recommend to set it bigger then 5) \r Continue with " + refresh_int + " Seconds?", "Realy dude?", MessageBoxButtons.YesNo); 
       if (confirm == DialogResult.Yes) 
       { 
        //Call Function 
        refresh_delay(); 
       } 
      } 
      else 
      { 
       //Call Function 
       refresh_delay(); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Please set refresh delay!"); 
     } 
    } 

quindi sono sicuro che il codice verrà eseguito tutti i secondi x ma dell'etichetta vengono aggiornate solo quando premo il pulsante di connessione, ma non se avviare il contatore dopo il collegamento con il tasto b_SET.

Le variabili da "get_psdata" non mostrano il valore aggiornato. Mostrano solo il risultato del primo "Get". Perché non mostrano l'ultimo risultato?

+2

Potresti per favore restringere la tua domanda ed evidenziare solo una parte problematica del tuo codice? Grazie e saluti, –

+0

@AlexBell Okey quindi la mia domanda è: come posso aggiornare le mie variabili dalla funzione get_psdata? Semplicemente non funzionerà. Non so dove sia il problema, ecco perché ho aggiunto un sacco di codice. L'errore potrebbe essere tutto ... (?) – SnipeLike

+1

Non sono sicuro se si tratta di WPF o WinForms, ma la mia impressione è che il problema potrebbe essere con il tentativo di aggiornare le etichette da un thread diverso (che utilizza il timer). Puoi provare a inviare gli aggiornamenti al thread principale. – vesan

risposta

2

Se utilizzo il tuo codice in una schermata di winform fresca, tutto funziona correttamente. Ho comunque usato la seguente implementazione per get_psdata.

public void get_psdata() 
{ 
    var rnd = new Random(); 

    //Set data into Var 
    L_cputemp_show.Text = rnd.Next().ToString(); 
    L_gputemp_show.Text = rnd.Next().ToString(); 
    L_firmware_show.Text = rnd.Next().ToString(); 
    L_type_show.Text = rnd.Next().ToString(); 

    //Update Label 
    L_cputemp_show.Refresh(); 
} 

Con un intervallo di 1 secondo, questo mi dà nuovi valori sullo schermo ogni secondo. Potresti provare questo codice per favore? Se funziona bene, allora il problema è con l'oggetto PS3 che non aggiorna i suoi interni forse?

+0

Oh ho cambiato il mio codice nel tuo esempio e il testo aggiorna tutti i x secondi ... Grazie. Ma cosa posso fare ora per farlo funzionare con il mio codice? – SnipeLike

+0

Sembra che "PS3.GetTemperatureCELL" non aggiorni il cputemp var eseguendolo? – SnipeLike

+1

Quindi sembra.Sono disponibili ulteriori informazioni sull'oggetto PS3? Genere? Documentazione? –

Problemi correlati