2014-12-18 116 views
5

我在寫一個C#程序來顯示我的PS3中CPU/GPU的溫度。 有一個連接按鈕。這工作真的很好,它顯示了溫度。來自我的PS3的CPU/GPU。C#變量不會更新

現在我已經實現了一個「刷新」按鈕,啓動一個定時器所有X秒要做到這一點:

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(); 
     } 

所以這個「get_psdata」僅適用於第一次,當我按下連接按鈕。 (該連接按鈕直接啓動「get_psdate」功能,同時刷新按鈕確實有些不同,比如你可以在後面看到...)

這裏是運行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; 
      } 
     } 

爲了測試,我添加了一個Messagebox.Show到「get_psdata」功能,看它是否運行所有X秒......是它,這是我的計時器:

 //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(); 
     } 

而這正是啓動我的計時器:

//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!"); 
     } 
    } 

所以我敢肯定,代碼將運行所有X秒,但標籤的時候我打的連接按鈕只更新,但如果我用B_set按鈕連接後啓動計數器。

「get_psdata」中的變量未顯示更新後的值。他們只是顯示第一個「Get」的結果。 他們爲什麼不顯示最新結果?

+2

您能否縮小您的問題範圍並突出顯示您的代碼中有問題的部分?感謝和問候, –

+0

@AlexBell Okey所以我的問題是:如何從get_psdata函數更新我的變量?它只是不會工作。 我不知道問題在哪裏,這就是爲什麼我添加了很多代碼。失敗可能是每個...(?) – SnipeLike

+1

不知道這是WPF還是WinForms,但我的直覺是,這個問題可能與嘗試更新不同線程(計時器正在使用的)中的標籤有關。您可以嘗試將更新分派給主線程。 – vesan

回答

2

如果我在一個新的winforms屏幕上使用你的代碼,一切運作良好。然而,我對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(); 
} 

以1秒的間隔,這給了我每秒在屏幕上的新值。你可以試試這個代碼嗎? 如果這個效果很好,那麼問題是PS3對象可能沒有刷新它的內部?

+0

哦,我將我的代碼更改爲您的示例,並且文本刷新了所有x秒...謝謝。 但是我現在可以做些什麼來使它與我的代碼一起工作? – SnipeLike

+0

它看起來像「PS3.GetTemperatureCELL」通過運行它不更新cputemp var? – SnipeLike

+1

看來。是否有關於PS3對象的更多信息?類型?文檔? –