Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > event в Windows Forms


Автор: Karrde 27.2.2011, 17:32
Доброго времени суток. на c# написал свою длл, в которой есть ивент

Код

 public delegate void TimeEventHandler(object sender, PlayerTickEventArgs e);
public class CPlayShort
    {
        ...
        public event TimeEventHandler PlayTick;
        public void timerTick(object e)
        {
            PlayerTickEventArgs arg = new PlayerTickEventArgs((Int32)(_playerEx.GetPosition(TimeFormat.Milliseconds) / 1000));
            if (null != PlayTick)
            {
                PlayTick(new object(), arg);
            }
        }
    }


И в форме объявил объект класса, добавил подписку на ивент. Но функция выполняется в другом потоке, и следовательно, в ней нельзя вызывать контролы формы. Можно, конечно, добавить ещё один делегат, но, по идее, можно обойтись без него. Как нужно было делать этот ивент, чтобы спокойно в функции обработки ивента можно было вызывать контролы? Заранее спасибо

Автор: -Mikle- 27.2.2011, 18:50
Если ваша библиотека с классом CPlayShort имеет 100% отношение к формам и контролам (к представлению одним словом) внутри себя, то просто используйте таймер из пространства имен System.Windows.Forms, он генерит событие в основном потоке. Если ваша библиотека не имеет ничего общего с представлением, то просто неприлично будет задумываться об этом на стороне этой библиотеки. В последнем случае, нет ничего постыдного в том, чтобы в обработчике события (на стороне формы) расположить код по вызову Control.Invoke(...) (только вот не зачем еще один делегат вам, как вы сказали).

Автор: Karrde 28.2.2011, 23:38
Хм. т.е. это будет что-то типа
Код

  public delegate void DoPlayerTick(int current);
  public DoPlayerTick playerTickDelegate;
  private void Form1_Load(object sender, EventArgs e)
  {
...
       playerTickDelegate = new DoPlayerTick(TickChanged);
  }

//Функция, вызывающаяся при генерации события
  private void pPlayback_Tick(object sender, PlayerTickEventArgs e)
        {
            Form1.Invoke(Form1.playerTickDelegate, e.CurrentTime);
        }



Ну и функцию TickChanged объявляем. 
Но на инвоуке требует нестатический метод или поле. Чего то тут недопонимаю

Автор: Karrde 28.2.2011, 23:54
А, понял)) не Form1(это же класс))), а this. Спасибо большое))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)