2013-09-15 4 views
1

У меня есть одно приложение, разработанное на C# и одна C# dll, которую я использую для последовательной связи. через каждые 10 секунд я хочу обновить графический интерфейс из dll и хочу отправить сообщение о статусе из dll в основную программу.Обновление строки состояния GUI от DLL

callback, возможно, вариант для этого. но не в состоянии написать его правильно.

Будет здорово, если кто-то может дать мне правильный синтаксис.

+0

Для этого событий недостаточно? –

+0

Классы в вашей DLL должны выставлять ** события **, которые ваш GUI регистрирует обработчики. –

+0

Пожалуйста, вырабатывайте .. –

ответ

0

Использование делегата:

public class SerialReader 
    { 
     public Action<string> Callback; 

     public void Read() 
     { 
      if (Callback != null) 
       Callback("Here is a message for the status bar"); 

     } 
    } 

Какие регистры класса GUI для:

public class GuiClass 
    { 
     public void foo() { 

      var reader = new SerialReader(); 
      reader.Callback = UpdateStatusBar; 

     } 

     public void UpdateStatusBar(string message) { 
      statusBar.Text = message; 
     } 

    } 

Убедитесь в том, обратный вызов установлен где-то в коде GUI:

reader.Callback = UpdateStatusBar; 
+0

Спасибо за ваши отзывы .. это было именно то, что я искал .. но после внедрения тот же код в моем приложении, который я нашел, если (Callback! = null) никогда не установлен в true, поэтому функция в моем основном приложении никогда не вызывается, .. это то, что мне не хватает для создания экземпляра. –

+0

См. Обновленный ответ –

+0

согласно вашей инструкции, которую я уже установил, но все еще не работает .. :) только для вашей информации обратите внимание, что класс serialReader находится в dll (реализован на C#), а графический интерфейс - это мое основное приложение .. это может помочь вам диагностировать мою проблему. –

1

Так что это всего лишь пример. Во-первых, код из вашей DLL, который предоставляет событие.

class MyWorkerClass 
{ 
    public event EventHandler<System.ComponentModel.ProgressChangedEventArgs> Changed; 

    void OnChanged(ProgressChangedEventArgs args) 
    { 
    if (Changed != null) Changed(this, args); 
    } 

    public void DoWork(object state) 
    { 
    // do your work 
    OnChanged(new ProgressChangedEventArgs(50, state); // use percentage 
    } 
} 

И код в вашем графическом интерфейсе.

public class MyGUI 
{ 
    readonly MyWorkerClass worker; 

    public MyGUI() 
    { 
     this.worker = new MyWorkerClass(); 
     this.worker.Changed += OnWorkerChanged; 
    } 

    public void OnWorkerChanged(object sender, ProgressChangedEventArgs args) 
    { 
     // ToDo: use args.ProgressPercentage to update a GUI element (example: ProgressBar) 
     // Remark: make sure you are in the GUI thread. Use this.InvokeRequired to check 
    } 
} 
+0

Хорошо;) рад, что это помогло. Тогда примите ответ. – Matthias

+0

Просто попытался реализовать ваши решения, но Changed всегда имеет значение null, поэтому обратный вызов не выполняется .., это то, что мне не хватает, чтобы создать экземпляр. –

Смежные вопросы