Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Часики на мди-форме отдельным потоком


Автор: NilovSerge 20.7.2008, 22:04
Всем привет!
Есть mdi-форма со всяким содержимым и часиками(timer c Interval = 1000) в нижнем углу. Если процесс в одной из дочерних форм
доcтаточно длителен, то часики останавливаются пока процесс не выполнится полностью. Хочется что часики работали не переставая...
пытаюсь делать отделным процессом :
Код

  public partial class mdi : Form
  {
    private delegate void SetUsersTimer();
    Thread TimerThread;
...

    private void mdi_Load(object sender, EventArgs e)
    {
      ...
      this.TimerThread = new Thread(new ThreadStart(SetTimerRunning));
      TimerThread.Start();
    }


    public void SetTimerRunning()
    {
      try
      {
        this.Invoke(new SetUsersTimer(this.UpdateCurrentTime), new object[] {}
        );
      }
      catch {}
    }

    private void UpdateCurrentTime()
    {
      System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
      timer1.Interval = 1000;
      timer1.Tick += new System.EventHandler(timer1_Tick);
      timer1.Enabled = true;
    }

    public void timer1_Tick(object sender, EventArgs e)
    {
      lblClock.Text = DateTime.Now.ToString();
    } 


Часики работают но та же проблема : если процесс в одной из дочерних форм доcтаточно длителен, то 
часики останавливаются, пока процесс не выполнится полностью...
Можно это побороть и как ?

   Заранее спасибо

Автор: mihryak 20.7.2008, 23:05
в доп. поток вообще-то принято выносить длительную и тяжёлую работу, а не обновление UI

часики останавливаются из-за того, что System.Windows.Forms.Timer работает через windows-сообщения, а твой главный поток слишком занят работой, чтобы на них реагировать
замени его на System.Timers.Timer (Invoke не забудь), а саму работу в отдельный поток - и будет тебе счастье ;)

Автор: Idsa 21.7.2008, 05:16
Цитата(mihryak @  21.7.2008,  03:05 Найти цитируемый пост)
System.Timers.Timer

Вместо него рекомендуется использовать System.Threading.Timer.

Автор: mihryak 21.7.2008, 09:07
Idsa, а почему?

Автор: Idsa 21.7.2008, 12:32
Цитата(mihryak @  21.7.2008,  13:07 Найти цитируемый пост)
Idsa, а почему? 

Позволю себе процитировать Рихтера:
Цитата

Класс Timer из пространства имен System.Timers является, по сути, оболочкой для класса Timer из пространства имен System.Threading. Он заставляет CLR по срабатыванию таймер ставить события в очередь пула потоков. Класс System.Timers.Timer происходит от класса Component из пространства имен System.ComponentModel, что позволяет объекты-таймеры размещать в области конструктора форм Microsoft Visual Studio. Также члены этого класса немного отличаются от других. Этот класс был добавлен в FCL давным-давно, когда у Microsoft еще не было четкой концепции потоков и таймеров. Вообще говоря, его стоило бы удалить, чтобы вместо него применялся класс System.Threading.Timer. Я никогда не использую класс System.Timers.Timer и вам не советую, за исключением случаев, когда нужно поместить таймер в область конструктора форм.

От себя добавлю, что в System.Timers.Timer нельзя задать dueTime и передать в метод пользовательский объект (state).

Автор: mihryak 21.7.2008, 15:15
отлично, буду знать!
спасибо

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