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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заставить таймер работать в другом потоке 
:(
    Опции темы
CasperSC
Дата 5.4.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так пробовал, ничего не получилось.
Код

         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 нажму на горячую клавишу, то скриншоты пока будут делаться, таймер будет простаивать и не сработает будильник. Что делать? Я уже много всего перепробовал, нету толку, думаю может с потоками, что получиться.
PM MAIL   Вверх
jonie
Дата 5.4.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
CasperSC
Дата 5.4.2010, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну почитал я справку в msdn и некоторые сайты посмотрел, тока от этого таймер не стал работать в другом потоке, что-то не ясно как это делается конкретно в моём случае. Я сомневаюсь, что тут надо тонну кода написать, чтобы я понял как он работает.
Тут я увидел http://www.sql.ru/Forum/actualthread.aspx?...=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 - 5.4.2010, 22:19
PM MAIL   Вверх
CasperSC
Дата 6.4.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну как обычно, тема умерла. Неужели никто не знает? Если сам разберусь, выложу сюда пример, для других.
PM MAIL   Вверх
ДобренькийПапаша
  Дата 6.4.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Вы в своём первом примере не забыли сделать

Код

tt.Start();


нет?)))

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

Это сообщение отредактировал(а) ДобренькийПапаша - 6.4.2010, 22:11


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
mrbrooks
Дата 7.4.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



CasperSC, ваш код ломает мозг.

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

Это как? Циклическую обработку с задержкой? Может. Но не так - как вы написали. 
PM MAIL   Вверх
CasperSC
Дата 8.4.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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

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

Это сообщение отредактировал(а) CasperSC - 8.4.2010, 11:59
PM MAIL   Вверх
radow
Дата 13.4.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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();
        }

}

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

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


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

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


 




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


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

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