2017-08-08 12 views
3

最近、このトリッキーな問題に遭遇しました。誰かが私を助けてくれることを願っています。C#トラックバーが更新されない

iは音量を表示するようトラックバーを使用するプログラムを持って、それは、シリアル経由のArduinoで制御されます。それは次のコードで完璧に動作する任意の方法で(スライダーを動かす)trackarの

私は(programmaticaly)の値を変更しようと、:

trackbar1.Value = ...; 

しかし、私は自分のシリアルでこれを置きますデータ・ハンドラーは、それが動作しません:

/私は、シリアル・データ・ハンドラーをこのように宣言します。

//declaring arduinoCom 
public SerialPort arduinoCOM; 

//In form1 
arduinoCOM.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

私のハンドラは、次のようになります。

public void DataReceivedHandler(
         object sender, 
         SerialDataReceivedEventArgs e) 
    { 
     trackBar2.Value = 50; 

    } 

シリアル通信は完璧に機能し、ハンドラは問題ありません。

私は今、2日間試したと私は「trackbar1.valueが」どこにあるか作業トラックバーと、動作していない唯一の違いがあることを識別することができました。だから私は明確な理由のために(私の希望)不必要なコードの残りの部分を削除しました。

だから私の質問は、私はそれが「基準法」

追加情報の外の値です変更しようとすると、なぜトラックバーのスライダーが動かないんです。私はプログラムを走ってみましたし、その後でそれを一時停止しました視覚的なスタジオとtrackbar.Valueが正常に変更されている、動作していない唯一のものは、グラフィックス側です。

私は複数のトラックバーでテストし、それはトラックバー1と2の値だけでなく、すべての5の絵の

ピクチャー機能しなかった

trackbar1.Refresh(); 

を使用して試してみた: Values of trackbars

trackbars not moving

答えて

5

SERIALPORTためのDataReceivedイベントがsecundaryスレッド上で発生します(UIスレッドではありません)、UI要素を変更できません。 「起動」を使用して 、あなたが代わりに

public void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    trackBar2.Value = 50; 

} 

利用のUIスレッド の変化作ることができます:私は使用していた私のシリアル通信を宣言されたときに

public void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    if (trackbBar2.IsHandlecreated) trackBar2.Invoke(new Action(() => trackbar.Value = 50)); 
} 
+0

が私のために動作しませんでした、私はエラーが「ウィンドウハンドルが作成されるまで呼び出しまたはBeginInvokeをコントロール上で呼び出すことはできません」を取得します。私はオンラインで見ましたが、問題によく似た例は見つけられません。私は答えを探し続けます。 – Klue

+0

それは、DataReceivedイベントが、ハンドラが追加された直後で、Window&trackbar自体が適切にインスタンス化されてハンドルが作成される直前にトリガされたようです。彼は変更を呼び出す前にこれをチェックすることができます(答えたコードは更新されました...) –

+0

さらに、シリアルポートがDataReceivedイベントを発生させている間にアプリケーションがウィンドウを閉じると、そのエラーメッセージが表示されることがあります。 したがって、ウィンドウを閉じる前に必ずイベントハンドラを削除してください(フォームのonClosingイベントでは?)。 –

1

を私が `、問題を発見しました

Form1 form1 = new Mixer.Form1(); 
    initialiseSerialEventHandler(arduinoCOM); 

し、代わりに私が唯一

を使用する必要があります
関連する問題