Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Запуск/остановка таймера из другого потока


Автор: Jamezzz 4.12.2011, 12:10
Здравствуйте. На форме имеется кнопка (startButton) и таймер (mainTimer). Таймер циклично меняет надпись кнопки от 0 до 10. При нажатии на кнопку запускается второй поток (который должен запускать таймер, засыпать на 5000 мс, останавливать таймер). То есть, на время сна второго потока, на копке должны меняться цифры. Этого почему-то не происходит. Что делаю не так?

Код

using System;
using System.Windows.Forms;
using System.Threading;

namespace TimerTest
{
    public delegate void WorkerAction();

    public partial class MainForm : Form
    {
        Worker xWorker;
        Thread workerThread;
        int counter;

        public MainForm()
        {
            InitializeComponent();
            xWorker = new Worker(new WorkerAction(mainTimer.Start), new WorkerAction(mainTimer.Stop));
            workerThread = new Thread(new ThreadStart(xWorker.Job));
            counter = 0;
        }

        private void startButton_Click(object sender, EventArgs e)
        {
            workerThread.Start();
        }

        private void MainTimer_Tick(object sender, EventArgs e)
        {
            startButton.Text = counter.ToString();

            counter = (counter == 10 ? 0 : counter + 1);
        }
    }

    public class Worker
    {
        WorkerAction beforeJobAction;
        WorkerAction afterJobAction;

        public Worker(WorkerAction _BeforeJobAction, WorkerAction _AfterJobAction )
        {
            beforeJobAction = _BeforeJobAction;
            afterJobAction = _AfterJobAction;
        }

        public void Job()
        {
            beforeJobAction();
            Thread.Sleep(5000);
            afterJobAction();
        }
    }
}


Автор: LostGuard 25.9.2013, 12:24
Запускать/останавливать таймер нужно из того же потока в котором он был создан.

Автор: LostGuard 25.9.2013, 12:38
Вот для примера программка, народ не думайте что я некропостю  smile  просто забив в гугл запрос "c# управление таймером из другого потока" я в начале попал на эту страницу, так что пусть будет)

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