0

私は約1年前から製造機械用のGUI(またはHMI)を開発してきました。GUIが読み取りアクセスを必要とするマシンには約5000個のパラメーターがあります。

現在、マシンからすべての変数をマシンからのいくつかの大きなデータブロックとして収集し、それらを解析してGUIのリストに配置するデーモンスレッドがあります。

私は40ミリ秒未満ですべてを収集、更新、解析します。これは、必要な1秒の更新頻度をはるかに下回っているため、これは問題なく機能していると思います。

問題は、実際のGUIでコントロールを更新する方法です。コントロールは、それが作成されたのと同じスレッドでしか更新できないためです。現在、すべてのコントロールをループする別のスレッドを使用してから、BeginInvoke(winform)またはDispatcher(wpf)を使用してユーザーのすべてを更新しています。これは私には非常に複雑に思えます。

似たようなことをしたり、GUIを更新するためのよりエレガントな方法を持っている人はいますか?

ありがとう!

4

3 に答える 3

0

次の例に示すように、ListViewを使用して、アイテムの追加、リストへのテキストボックスの更新を行うイベントを発生させることができます。UpdateUiEventだけでなく、任意のbackgroundworkerがアクセスできるように、グローバルスコープに変数を追加する必要があります。

ListViewItem _listViewItem;

private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
    //your loop to get list view item
    _listViewItem = new ListViewItem(mytext) {tag = mytagobject);
    _listViewItem.SubItems.Add(mysubitemtext);
    Invoke(new EventHandler(UpdateUiEvent), new[] { sender, e });
}

void UpdateUiEvent(object sender, EventArgs e)
{
    listView1.Items.Add(_listViewItem);
}
于 2012-07-12T11:14:10.587 に答える
0

There in an other alternative threading method ,

Define this code in constructor,

     RunAsynchroneWork(new DoWorkEventHandler(RestartOnLoaded), new    RunWorkerCompletedEventHandler(RestartOnLoaded_Completed));

and write following codes into related place

 //AsynchroneWorker 
    public void RunAsynchroneWork(DoWorkEventHandler workHandler, RunWorkerCompletedEventHandler workCompletedHandler = null)
    {
        BackgroundWorker backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += workHandler;
        if (workCompletedHandler != null) backgroundWorker.RunWorkerCompleted += workCompletedHandler;
        backgroundWorker.RunWorkerAsync();
    }

   public void RestartOnLoaded(object sender, DoWorkEventArgs e)
    {

    //DO SOMETHING HERE   

    }


    public void RestartOnLoaded_Completed(object sender, RunWorkerCompletedEventArgs e)
    {
      //DO SOMETHING HERE ( after completion of RestartOnLoaded ) 
    }
于 2012-07-12T06:48:33.107 に答える
0

BackgroundWorkerを使用してみてください

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

DoWorkイベントでは、データを収集し、レポートの進行状況機能を使用してチャンクで渡すか、結果で一度に渡します。これにより、Invokeを使用する必要がなくなります。

于 2012-07-12T06:43:37.347 に答える