0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 9
1

Таймер и WPF

23.03.2013, 22:38. Показов 4119. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть приложения на WPF, и есть задача, которую нужно выполнять раз в 1 секунду. Для этого я использую system.threading.timer (или можно system.timers.timer), работает всё замечательно, но в методе таймера мне нужно создавать событие, а как раз на это событие подписывается контрол из WPF. Дело в том, что как вы знаете UI поток и методы этих таймеров выполняются в разных потоках. Знаю, можно было бы использовать dispatchtimer, но не хочется забивать пользовательский поток такими частыми процедурами. Пробовал вызов Invoke и BeginInvoke, ошибок нет, но событие не срабатывает. Подскажите, как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2013, 22:38
Ответы с готовыми решениями:

Таймер на платформе WPF
Все консольные примеры MSDN порой оказываются настоящей головоломкой при переходе к реальным...

Как сделать таймер (WPF)?
Собственно как его сделать?) В винформ всё понятно, а на WPF?

[WPF] Нажать на кнопку с задержкой. Таймер?
Хочу выполнить простую задачу, но нигде не могу найти того, что заработает в моем случае. В WPF...

Таймер должен через время положить файл на БД. [Таймер]
Мне нужен таймер, а я не знаю как его делать именно, чтоб в конкретное время он сохранял информацию...

6
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
24.03.2013, 00:27 2
Приведите код с Invoke/BeginInvoke, чтобы прояснить почему не срабатывает.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 09:36 3
Цитата Сообщение от Di-man Посмотреть сообщение
Пробовал вызов Invoke и BeginInvoke, ошибок нет, но событие не срабатывает. Подскажите, как быть?
Покажи весь код класса, иначе сам подумай, как тебе тут помогать будут.

Добавлено через 4 минуты
Цитата Сообщение от Di-man Посмотреть сообщение
ошибок нет, но событие не срабатывает
Ещё возможен вариант, что надо сделать такие действия, чтобы увидеть ошибку: Отладка -> Исключения. Далее проставить везде галочки где надо (отсеишь).
0
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 9
24.03.2013, 12:34  [ТС] 4
Вот мой класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
namespace vkontakte.src.vk.message
{
    public class NewMessages
    {
        private string jString;
 
        public int count { get; set; } 
     
        // Событие: новое сообщение
        public event EventHandler<NewMessageEventArgs> NewMessage;
 
        // Событие: новых сообщений нет
        public event EventHandler<EventArgs> EmptyMessage;
 
        // Задержка (интервал вызова функции)
        private int delay = 800;   // 1000
 
 
        //Таймер
        private Timer timer;
 
      
        public NewMessages()
        {
            TimerCallback method = new TimerCallback(checkNewMessage);
 
            timer = new Timer(method);
            timer.Change(0, delay);  
        }
 
 
        void checkNewMessage(object sender)
        {
 
            // Строка с json
            jString = "...";
 
            // Количество сообщений
            count = int.Parse(Regex.Match(jsonString, @"(?<=resp\D*)\d+").Value);
 
            switch (count)
            {
            // --- Новых сообщений нет --- 
                case 0:
 
                    ////////////////////////////////////////////////////////////////////////////////////////
                    OnEmptyMessage(EventArgs.Empty);
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
 
            // --- Есть новые сообщения --- 
                default:
 
                    ////////////////////////////////////////////////////////////////////////////////////////
                    OnNewMessage(new NewMessageEventArgs(messages.messages.Count, messages, count);
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
            }            
 
        }
 
        // Событие получения нового сообщения
        protected virtual void OnNewMessage(NewMessageEventArgs e)
        {
            if (NewMessage != null)
                NewMessage(this, e);
        }
 
        // Событие новых сообщений нет
        protected virtual void OnEmptyMessage(EventArgs e)
        {
            if (EmptyMessage != null)
                EmptyMessage(this, e);
        }
        
    }
}
Всё, что выделе длинными комментариями (создание событий) нужно выполнять в UI потоке.

Пока нашёл такое решение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch (count)
            {
            // --- Новых сообщений нет --- 
                case 0:
 
                    ////////////////////////////////////////////////////////////////////////////////////////
                    App.Current.Dispatcher.BeginInvoke(new Action( () => OnEmptyMessage(EventArgs.Empty) ));
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
 
            // --- Есть новые сообщения --- 
                default:
                    ////////////////////////////////////////////////////////////////////////////////////////
                    App.Current.Dispatcher.BeginInvoke(new Action(() => OnNewMessage(new NewMessageEventArgs(messages.messages.Count, messages, count))));
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
            }
Насколько это правильно, и может быть можно сделать лучше?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.03.2013, 20:46 5
Di-man, ну как вам сказать, если учесть, что можно сделать в одну строчку и вот это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
switch (count)
            {
            // --- Новых сообщений нет --- 
                case 0:
 
                    ////////////////////////////////////////////////////////////////////////////////////////
                    App.Current.Dispatcher.BeginInvoke(new Action( () => OnEmptyMessage(EventArgs.Empty) ));
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
 
            // --- Есть новые сообщения --- 
                default:
                    ////////////////////////////////////////////////////////////////////////////////////////
                    App.Current.Dispatcher.BeginInvoke(new Action(() => OnNewMessage(new NewMessageEventArgs(messages.messages.Count, messages, count))));
                    ////////////////////////////////////////////////////////////////////////////////////////
 
                    break;
            }
заменить на
C#
1
2
Action action = count == 0 ? () => OnEmptyMessage(EventArgs.Empty) : () => OnNewMessage(new NewMessageEventArgs(messages.messages.Count, messages, count))
App.Current.Dispatcher.BeginInvoke(action);
Хотя я бы не стал делать 2 разных события, проще сделать так:
C#
1
2
3
4
5
6
7
8
9
10
class Message
{
   public virtual bool IsEmpty {get {return false; }}
   string content;
}
 
class EmptyMessage : Message
{
   public override bool IsEmpty {get {return true;}}  
}
0
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 9
24.03.2013, 20:52  [ТС] 6
Спасибо, но так не получится:
Цитата Сообщение от Psilon Посмотреть сообщение

C#
1
2
Action action = count == 0 ? () => OnEmptyMessage(EventArgs.Empty) : () => OnNewMessage(new NewMessageEventArgs(messages.messages.Count, messages, count))
App.Current.Dispatcher.BeginInvoke(action);
Потому что там выполняется много условий, приведён не весь код.
И я не особо понял как и где и зачем делать два класса? У меня один. Просто два разных событий. У них разное количество параметров и разное назначение
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.03.2013, 21:26 7
Di-man, я ваш же код переписал, что может не получиться? Это эквивалентное преобразование...
Два класса, чтобы сделать одно событие, это намного удобнее... Подробнее можете тут почитать:
http://occs.cs.oberlin.edu/~jw... bjPattern/
http://babylon.wiki-wiki.ru/b/... D0%B0_Null
0
24.03.2013, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2013, 21:26
Помогаю со студенческими работами здесь

Поясните за таймер!) Или таймер на формах наследниках
Доброго. В проге есть основная форма и в процессе работы создается 1-2-3-4-5 форм наследников все...

WPF async void fun() для событий контролла. (MapCOntrol.WPF)
Задача: Отмечаем чекбокс элементы и рисуем их на карте. При нажатии на кнопку выполняется...

WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html Для использования и...

Открыть WPF внутри другого WPF окна
Добрый день! Имеется задача: В WPF окне (назовем его MainWindow.xaml с привязкой к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru