1

我对这一切都很陌生,所以请多多包涵!我正在编写一个小应用程序来控制我的望远镜,此刻我可以连接到它并告诉它指向哪里。我想要几个文本框,或者随着望远镜位置不断更新的标签 -T是望远镜对象,我正在调用T.Altitude, T.AzimuthT.RightAscention并且T.Declination我希望这些值每半秒左右更新四个标签。我假设我需要使用后台工作人员,但我正确吗?我可以访问 Telescope 对象,因为它是在主线程上创建的吗?我到底是怎么做的!这就是我到目前为止所拥有的(而且不多!)......

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 类之一。这些类以指定的时间间隔调用给定的委托。

Windows.Forms 命名空间中的 Timer 类在 UI 线程中调用委托,因此您不必为调度或其他任何事情而烦恼,但如果您过于频繁地调用它,它可能会降低 UI 的响应速度。

其他 Timer 使用单独的线程,因此您将需要使用 Dispatcher 对象或 SynchronizationContext 对象来修改 UI 值。您可以在 msdn 上阅读有关这些内容的更多信息。

于 2013-03-10T18:31:46.137 回答
1

最简单的方法可能是建议使用Windows.Forms.Timer使用望远镜(对象)中的当前值定期更新 Gui。

作为旁注,后台工作器在 C# 5.0 中有点过时了,因为它更容易使用 async/await(请参阅有关 async/await 与 BackgroundWorker 的线程)。

这是 WinForms 中的示例实现,它每 500 毫秒刷新一组标签。

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 回答