2017-02-09 24 views
-1

スレッドクラスのmy textboxフィールドの値を取得しようとしていますが、値は常に空です。デバッガでブレークポイントを確認しようとしましたが、「関数評価ではすべてのスレッドを実行する必要があります」と表示されます。C#はマルチスレッドでテキストボックスのフィールド値を取得できません

私はMSDNでthis explanationを見つけましたが、スレッドクラスのテキストボックス値を取得することはできません。ここで

は、スレッド機能を開始するために私の窓の負荷である:ここで

//Read D6010 Status To Get Weight Value on D6020 
ThreadStart readWeightRef = new ThreadStart(readWeightStatusThread); 
Thread readWeightThread = new Thread(readWeightRef); 
readWeightThread.Start(); 

は私のスレッドクラスコードです:これを解決する

public void readWeightStatusThread() 
{ 
    string readStatus = (string)txtD6010Status.Invoke(new Func<string>(()=> txtD6010Status.Text));` 

    while (Thread.CurrentThread.IsAlive) 
    { 
     MessageBox.Show(readStatus); 
    } 
} 

任意の方法?

+0

ロードイベントでスレッドを開始しますか?コンストラクタですでに設定されているテキストボックスのテキストですか? –

+0

'Load'が呼び出される前にフィールドに確実にデータが入力されていますか?また、ループに文字列の割り当てを移動します(私はそれがテスト目的のためだけであると仮定します)。 –

答えて

2

テキストボックスから値を読み取るのは、まだウィンドウの読み込み中に1回だけ空白になっていて、もう一度それを読み込もうとしないときのように見えます。プライベート変数を作成しないのはなぜ

は、代わりにプライベート変数の値にアクセスOnTextBoxTextChangedに更新されますその(静的?)この

public void readWeightStatusThread() 
    { 
     while (Thread.CurrentThread.IsAlive) 
     { 
      string readStatus = (string)txtD6010Status.Invoke(new Func<string>(() => txtD6010Status.Text)); 
      MessageBox.Show(readStatus); 
     } 
    } 
2

ような何かにあなたのワーカースレッドを更新してください。スレッドからUIコントロールにアクセスするべきではありません。なぜなら、UIコントロールは常にメインスレッド上にあるため、スレッドからUIコントロールにアクセスする際に問題が発生するからです。これはあまりにも多くの問題を引き起こしてはいけませんが、私的なグローバル変数を読むため。このよう

:あなたがスレッド上であなたのTextBoxのように、UIコントロールを更新する必要がある場合

private void OnTextBoxTextChanged(object sender, EventArgs e) 
{ 
    someGlobalVariable = ((TextEdit)sender).Text; 
} 

- あなたはスレッドがこのようなUI制御スレッド(メインスレッド)と一致するかどうかを確認する必要があります。

private delegate void TextBoxDelegate(TextBox textBox, string text); 

private void SetTextBox(TextBox textBox, string text) 
{ 
    if (textBox.InvokeRequired) 
    { 
     textBox.Invoke(new TextBoxDelegate(SetTextBox), textBox, text); 
    } 
    else 
    { 
     textBox.Text = text; 
    } 
} 
関連する問題