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


Автор: CasperSC 5.4.2010, 20:08
Так пробовал, ничего не получилось.
Код

         System.Threading.Thread tt = new System.Threading.Thread(new System.Threading.ThreadStart(timerCheckTime_Tick));


Вот что делает таймер:
Код

//таймер проверяет все включённые будильники в списке на срабатывание
        void timerCheckTime_Tick(object sender, EventArgs e)
        {
            for (int i = 0; i < this.listViewAlarm.Items.Count; i++) //прогоняем на проверку весь список
            {
                if (((AlarmClock)this.listViewAlarm.Items[i].Tag).EnabledAlarmClock) //если включён
                {
                    if (((AlarmClock)this.listViewAlarm.Items[i].Tag).CheckAlarmClock()) //проверяем будильник на срабатывание
                    {
                        this.listViewAlarm.Items[i].SubItems[1].Text = 
                            ((AlarmClock)this.listViewAlarm.Items[i].Tag).NextDate;
                        CreateAlarm(i);
                    }
                }
            }
            //Application.DoEvents();
        }


Просто у меня в программе можно делать скриншоты и если я раз 10 нажму на горячую клавишу, то скриншоты пока будут делаться, таймер будет простаивать и не сработает будильник. Что делать? Я уже много всего перепробовал, нету толку, думаю может с потоками, что получиться.

Автор: jonie 5.4.2010, 20:26
http://dotnetperls.com/backgroundworker
и вообще про этот класс почитайте, в интернет тонны информации

Автор: CasperSC 5.4.2010, 21:52
Ну почитал я справку в msdn и некоторые сайты посмотрел, тока от этого таймер не стал работать в другом потоке, что-то не ясно как это делается конкретно в моём случае. Я сомневаюсь, что тут надо тонну кода написать, чтобы я понял как он работает.
Тут я увидел http://www.sql.ru/Forum/actualthread.aspx?bid=34&tid=661609&hl= код. Я как понял этот самый BackgroundWorker можно вместо таймера использовать? По английски к сожалению я не супер читаю. 

Вот как выполнить операцию? Не один из способов не подходит

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication8
{
    public partial class FormMain : Form
    {
       // Thread thr;
        BackgroundWorker bw = new BackgroundWorker();
        public FormMain()
        {
            InitializeComponent();
           // thr = new Thread(new ThreadStart(LaunchSelScreen));
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            LaunchSelScreen();
        }

        private void btnLaunchSelScreen_Click(object sender, EventArgs e)
        {

            bw.RunWorkerAsync();
           // thr.Start();
        }

        void ShowMessage()
        {
            MessageBox.Show("Привет!");
        }

        private void LaunchSelScreen()
        {
            this.Hide();
            Form1 frm = new Form1();
            this.WindowState = FormWindowState.Minimized;
            System.Threading.Thread.Sleep(250);
            frm.Owner = this;
            frm.Show();
        }

        private void btnCloseApplication_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

Автор: CasperSC 6.4.2010, 10:49
Ну как обычно, тема умерла. Неужели никто не знает? Если сам разберусь, выложу сюда пример, для других.

Автор: ДобренькийПапаша 6.4.2010, 22:02
Вы в своём первом примере не забыли сделать

Код

tt.Start();


нет?)))

Если забыли, то сделайте. Но у Вас всё равно код не будет работать корректно, у вас в функции, которую вы запускаете в отдельном потоке есть обращение к контролам формы, которые созданы в другом потоке, соответственно, эксэпшн вам обеспечен. Для того, чтобы его не получать, прочитайте про InvokeRequired. Надеюсь я Вам помог  smile 

Автор: mrbrooks 7.4.2010, 09:37
CasperSC, ваш код ломает мозг.

Цитата(CasperSC @  5.4.2010,  22:52 Найти цитируемый пост)
Я как понял этот самый BackgroundWorker можно вместо таймера использовать?

Это как? Циклическую обработку с задержкой? Может. Но не так - как вы написали. 

Автор: CasperSC 8.4.2010, 11:57
Цитата(mrbrooks @ 7.4.2010,  09:37)
CasperSC, ваш код ломает мозг.

Цитата(CasperSC @  5.4.2010,  22:52 Найти цитируемый пост)
Я как понял этот самый BackgroundWorker можно вместо таймера использовать?

Это как? Циклическую обработку с задержкой? Может. Но не так - как вы написали.

Ничего себе ломает мозг. А по другому как? Там условий тонна. Я и так всё упростил, до проще некуда, раскидал по методам. А как по другому? У меня рядом не сидит учитель программист. я вообще сам с нуля учусь программированию. И я бы хотел услышать всё-таки ответ на моё сообщение. Это я про код в первом посту, да и в следующем, проще нельзя думаю сделать, хотя я вообще пока не умею этим BackgroundWorker'ом работать.

Автор: radow 13.4.2010, 00:01
Код

using System.Timer;


Код

public partial class Form1 : Form
{

        delegate void DelNewTxtLabel(string txt);// определяем делегат для изминения формы из другого потока

        System.Timers.Timer timer = new System.Timers.Timer();//таймер который работает в другом потоке
        int sec = 0;

        public Form1()
        {
            InitializeComponent();
            timer.Elapsed += new ElapsedEventHandler(WorkTimer);
            timer.Interval = 1000;
        }

        private void WorkTimer(object sender, ElapsedEventArgs e)
        {
            string txt = String.Format("С работы таймера прошло {0} c.", sec++);
            if (this.labTimer.InvokeRequired == true)
            {
                DelNewTxtLabel d = new DelNewTxtLabel(ChangeLabel);
                this.Invoke(d, new object[] { txt });
            }
            else
            {
                this.labTimer.Text = txt;
            }
            

        }

        private void ChangeLabel(string txt)// ф-ция изминения формы связаная с делегатом DelNewTxtLabel
        {
            this.labTimer.Text = txt;
        }

        private void butStartTimer_Click(object sender, EventArgs e)// событие по нажатию на кнопку запускает таймер
        {
            timer.Start();
        }

}

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