Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Часики на мди-форме отдельным потоком, не получается... 
:(
    Опции темы
NilovSerge
Дата 20.7.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 6.10.2007

Репутация: нет
Всего: нет



Всем привет!
Есть 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таточно длителен, то 
часики останавливаются, пока процесс не выполнится полностью...
Можно это побороть и как ?

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

PM MAIL   Вверх
mihryak
Дата 20.7.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



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

часики останавливаются из-за того, что System.Windows.Forms.Timer работает через windows-сообщения, а твой главный поток слишком занят работой, чтобы на них реагировать
замени его на System.Timers.Timer (Invoke не забудь), а саму работу в отдельный поток - и будет тебе счастье ;)
PM MAIL ICQ   Вверх
Idsa
Дата 21.7.2008, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



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

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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mihryak
Дата 21.7.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Idsa, а почему?
PM MAIL ICQ   Вверх
Idsa
Дата 21.7.2008, 12:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Цитата(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).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mihryak
Дата 21.7.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



отлично, буду знать!
спасибо
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.