C # WinForms: активация таймера из потока - PullRequest
1 голос
/ 10 августа 2011
public void timer_thing()
{
    Thread timer = new Thread(new ThreadStart(() =>
      {
          Thread.Sleep(500);
          if (is_mouse_down)
              timer1.Enabled = true;
      }
    ));
    timer.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    //some stuff happens here
}

Как видите, я хочу, чтобы поток активировал таймер.Но таймер не активируется.Я думаю, что это не правильный путь.Или я что-то упускаю.

Ответы [ 6 ]

1 голос
/ 10 августа 2011

Возможно, что is_mouse_down равно false всякий раз, когда поток попадает в эту инструкцию.Поток не будет волшебным образом ждать, пока он превратится в true.

Однако у вас есть еще одна, более серьезная проблема, о которой нужно беспокоиться.Дело в том, что вы не можете прикоснуться ни к одному элементу пользовательского интерфейса из рабочего потока или к любому другому, кроме потока пользовательского интерфейса.Это включает в себя System.Windows.Forms.Timer.Все виды неопределенного хаоса могут возникнуть.Ваша заявка может быть непредсказуемой и впечатляющей.

Мне не совсем понятно, зачем нужен поток.Не можете ли вы обработать событие Control.MouseDown и включить таймер в обработчике события для этого события?Вот как бы я решил проблему.

1 голос
/ 10 августа 2011

Ваш поток не ожидает события is_mouse_down. Он просто проверяет через полсекунды, и если это не так, время не включается, и протектор закрывается. Может быть, вам стоит попробовать использовать событие?

0 голосов
/ 12 августа 2011

Вы должны передать обратный вызов timer1_Tick при объявлении объекта таймера.

0 голосов
/ 10 августа 2011

Если у вас есть вопросы о многопоточности в c #, прочитайте эту статью. Это действительно полезно и покажет вам AutoresetEvent, ManualResetEvents, таймеры потоков, таймеры и т. Д. Действительно хорошая общая статья.

0 голосов
/ 10 августа 2011

Эта проблема, как описано в литературе, имеет два решения:

1) Активное ожидание

2) Уведомления

Если вы хотите активное ожидающее решение (которое действительно устарело, ваш поток должен иметь цикл while).

Если вы хотите получить уведомление, когда вам нужно вызвать какой-то метод, который запускает таймер в обработчике события мыши вниз

0 голосов
/ 10 августа 2011

Вы можете использовать AutoResetEvent для автоматического запуска его из обработчика нажатия кнопки.

Итак, в потоке просто установите:

autoResetEvent.WaitOne();
timer1.Enabled = true; 

и в обработчике нажатия кнопки:

autoResetEvent.Set();

Кстати, почему вы не можете инициализировать таймер в обработчике кликов?

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