2012-04-16 82 views
1

我在C#.NET中有一個簡單的標籤,似乎不是「更新」。它只顯示我的應用程序的第一個初始值。在下面的代碼中,「score」變量不會更新,但是當messagebox.show對話框被調用時它會顯示正確的值。評分值是在不同的線程中更改的,但我不認爲這是調用和跨線程表單控制的問題(因爲我在創建label6的線程中調用此代碼)。標籤文本顯示不正確,但messagebox.show

有誰知道什麼可能是一個解決方案?我嘗試了無效的Application.DoEvents()方法。另外,label6.Update()和label6.Refresh()在放置在label6.Text = score行後面時似乎都不起作用。

玩家是我創建的一個類,其作爲公共int持有得分值。

public Form1() 
    { 
     InitializeComponent(); 
     createGame(); 
    } 
    public void createGame() 
    { 
     InitializeComponent(); 
     drawThread = new Thread(draw); 
     MessageBox.Show(player.score); 
     label6.Text = player.score; 
    } 
    public void draw() 
    { 
     //do drawing, change player.score value 
     //end thread 
    } 
    public void button_click() 
    { 
     if(firstrun) 
      drawThread.Start() 
     else{ 
      createGame() 
      drawThread.Start() 
     } 

    } 

編輯(來自評論): 這是一個WinForms應用程序。 label6.Text = score line是除了在由Visual Studio生成的Form.Designer代碼中實例化之外調用label6的唯一實例。

+0

好吧,你的主線程在做什麼,然後,當它應該處理重繪等消息? – 2012-04-16 18:53:32

+0

這是一個WinForms應用程序嗎? Web應用程序?等等。? – 2012-04-16 18:53:52

+3

一個 - 通常你永遠不想從代碼中調用Application.DoEvents。其次,你確定其他代碼沒有進入這個人的背後,並將標籤文本設置爲其他東西嗎? – Tejs 2012-04-16 18:53:54

回答

2

只是做標籤上的Refresh()

label6.Refresh(); 
+0

如果'Application.DoEvents()'不處理隊列,爲什麼'label.Refresh()'應該解決問題? – Marco 2012-04-16 18:55:51

+0

當Text屬性被設置時,這不是自動完成的嗎? – 2012-04-16 18:56:04

+0

@MartinJames:不,當你更新Text屬性時,可能畫布會失效......但是直到主線程處理消息隊列並執行重繪,控件仍舊具有舊值... – Marco 2012-04-16 18:57:07

1

在你的代碼中,我看到

drawThread = new Thread(draw); 

但按鈕點擊你打電話draw.Start()所以我覺得你的渲染線程不會啓動!你不應該使用drawThread.Start()
更多:你不能從主不同的線程訪問圖形控件的屬性,你應該使用Invoke ...

我看到這裏有一個問題:

  1. drawThread = new Thread(draw);
    MessageBox.Show(player.score);

    有了這些行第二個線程立即顯示MessageBox(第二個線程可能未終止)

  2. label6.Text = player.score;
    Wh你關閉MessageBox這行是執行的:如果第二個線程終止並且已經更新了分數,你將得到預期的結果;如果第二個線程仍在執行,則在您的標籤中仍然可以找到以前的分數。

所以不知道你的第二個線程是幹什麼的,我不知道你的代碼是否正確。
在我看來,你應該從第二個線程(使用Invoke)更新label6.Text當它終止;如果沒有,爲什麼你使用第二個線程?
通常我們使用線程來執行很長的執行而不阻塞主線程(它負責更新表單和處理用戶輸入),所以當需要的時候應該從這些線程更新屬性。
想想使用BackgroundWorker

+0

圖形控件不被繪製線程訪問。 drawThread在一個單獨的類中更新一個值(分數)。 label.text在其創建的主線程中重繪。 – 2012-04-17 19:16:11

+0

我已修復您在原始帖子中描述的內容。 draw.Start()是我從我的代碼複製錯過。它實際上是drawThread.Start() – 2012-04-18 15:22:17

+0

@IanMcCullough:看看我編輯的答案 – Marco 2012-04-18 15:59:40