1

私はこれらすべてに非常に慣れていないので、ご容赦ください!望遠鏡を制御するための小さなアプリを作成しています。現時点では、望遠鏡に接続して、どこを指すかを伝えることができます。いくつかのテキスト ボックス、または望遠鏡の位置で常に更新されるラベルが必要です。これは望遠鏡オブジェクトでありT、 を呼び出しT.AltitudeておりT.Azimuth、これらの値で 4 つのラベルを 0.5 秒ごとに更新したいと考えています。バックグラウンドワーカーを使用する必要があると思いますが、正しいですか? メイン スレッドで作成された Telescope オブジェクトにアクセスできますか? そして、どのように私はそれをすべて行うのですか!これは私がこれまでに持っているものです(そしてそれほど多くはありません!)...T.RightAscentionT.Declination

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    string Az = T.Azimuth.ToString();
    string Alt = T.Altitude.ToString();
    string Dec = T.Declination.ToString();
    string Ra = T.RightAscension.ToString();

    System.Threading.Thread.Sleep(500);
}
4

2 に答える 2

2

あなたの場合、Timer クラスの 1 つを使用することを検討する必要があります。これらのクラスは、指定された間隔で特定のデリゲートを呼び出します。

Windows.Forms 名前空間の Timer クラスは UI スレッドでデリゲートを呼び出すため、ディスパッチなどを気にする必要はありませんが、頻繁に呼び出すと UI の応答が遅くなる可能性があります。

他のタイマーは別のスレッドを使用するため、Dispatcher オブジェクトまたは SynchronizationContext オブジェクトのいずれかを使用して UI 値を変更する必要があります。これらの詳細については、msdn を参照してください。

于 2013-03-10T18:31:46.137 に答える
1

最も簡単な方法は、おそらくWindows.Forms.Timerを使用して、望遠鏡(オブジェクト)からの現在の値でGuiを定期的に更新することをお勧めします。

ちなみに、Background Workerは、async / awaitの使用がはるかに簡単であるため、C#5.0では廃止されています(async / awaitとBackgroundWorkerについては、このスレッドを参照してください)。

これは、500ミリ秒ごとにラベルのセットを更新するWinFormsの実装例です。

public partial class MyForm : Form
{
    private readonly Timer _timer = new Timer();

    public MyForm()
    {
        InitializeComponent();

        _timer.Interval = 500;
        _timer.Tick += TimerTick;
        _timer.Enabled = true;
    }

    void TimerTick(object sender, EventArgs e)
    {
        _labelAzimuth.Text = T.Azimuth.ToString();
        _labelAltitude.Text = T.Altitude.ToString();
        _labelDeclination.Text = T.Declination.ToString();
        _labelRightAscension.Text = T.RightAscension.ToString();
    }
}
于 2013-03-10T19:30:24.750 に答える