Обновить содержимое текстового поля из другого потока в другом классе.C #, WPF - PullRequest
1 голос
/ 10 декабря 2011

Изучение C #, WPF. Я столкнулся с проблемой, которую не могу решить с помощью одного исследования.

Я хочу обновить текст элемента управления textbox из другого потока, который присутствует в другом классе.

Я знаю, что поток запущен, работает и содержит данные, которые я могу использовать для заполнения текстового поля. То, что я не могу понять, это как обратиться к элементу управления текстового поля в графическом интерфейсе из второго потока.

Элемент управления моего текстового поля называется «txt_CPU», и я хочу, чтобы в нем появился «cpuCount». Я уверен, что мне нужно использовать делегирование, но я не могу связать примеры с моим кодом.

Помощь приветствуется. (Я уверен, что в моем коде могут быть другие «проблемы», это грубое изучение в процессе)

Итак, у нас есть создание потока.

 public MainWindow()
        {
            InitializeComponent();

            //start a new thread to obtain CPU usage
            PerformaceClass pc = new PerformaceClass();
            Thread pcThread = new Thread(pc.CPUThread); 
            pcThread.Start();

        }

Класс, который он называет

 public class PerformaceClass
    {

            public string getCPUUsage()
            {
                PerformanceCounter cpuCounter;

                cpuCounter = new PerformanceCounter();

                cpuCounter.CategoryName = "Processor";
                cpuCounter.CounterName = "% Processor Time";
                cpuCounter.InstanceName = "_Total";
                return cpuCounter.RawValue.ToString() + "%";

            }

        public void CPUThread()
        {
            PerformaceClass PC = new PerformaceClass();

            int i = 0;
            while (i < 5)
            {
                string cpuCount = PC.getCPUUsage();
                i++;
                System.Threading.Thread.Sleep(500);
                // MessageBox.Show(cpuCount);

            }   
        }
    }

1 Ответ

3 голосов
/ 10 декабря 2011

Один из способов - добавить обработчик событий к вашему PerformaceClass следующим образом:

 public class PerformanceClass
 {
     public event EventHandler<PerformanceEventArgs> DataUpdate;

     ....
     public void CPUThread()
     {
        int i = 0;
        while (i++ < 5)
        {
            string cpuCount = getCPUUsage();
            OnDataUpdate(cpuCount);
            System.Threading.Thread.Sleep(500);

        }   
     }

     private void OnDataUpdate(string data)
     { 
          var handler = DataUpdate;
          if (handler != null)
          {
               handler(this, new PerformanceEventArgs(data));
          }
     }
 }

 public class PerformanceEventArgs: EventArgs
 {
       public string Data { get; private set; }
       public PerformanceEventArgs(string data)
       {
            Data = data;
       }
 }

Затем используйте его в своей основной записи так:

public MainWindow()
{
    InitializeComponent();

    //start a new thread to obtain CPU usage
    PerformanceClass pc = new PerformanceClass();
    pc.DataUpdate += HandleDataUpdate;
    Thread pcThread = new Thread(pc.CPUThread); 
    pcThread.Start();
}

private void HandleDataUpdate(object sender, PerformanceEventArgs e)
{
     // dispatch the modification to the text box to the UI thread (main window dispatcher)
     Dispatcher.BeginInvoke(DispatcherPriority.Normal, () => { txt_CPU.Text = e.Data });
}

Обратите внимание, что я исправил опечатку в PerformanceClass (отсутствует n).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...