17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
1

Почему Timer в одном приложении работает медленнее, чем в другом?

16.03.2014, 22:23. Показов 1495. Ответов 9
Метки нет (Все метки)

Привет. Есть сервер и клиент, на сервере работает таймер, каждый 50 миллисекунд он увеличивает значение переменной на 1. Когда запускается клиент, то он запрашивает текущее значение у счетчика на сервере, далее присваивает это значение своему счетчику, и запускает таймер, который раз в 50 миллисекунд увеличивает значение счетчика на 1. Так почему, при нескольких минутах работы сервера и клиента, значение счетчика на клиенте обгоняет значение счетчика на сервере?
Один человек сказал мне, что работу таймеров нужно завязывать на тиках. Но я не могу понять нескольких вещей, ведь тики являются чем-то таким, что определяет точность работы всех других вещей, будь-то Thread.Sleep() или работа таймера, а сами тики зависят же от скорости процессора? или нет? Тогда как на одном компе, два таймера могут работать неодинаково?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2014, 22:23
Ответы с готовыми решениями:

Почему память работает намного медленнее, чем процессор?
Как решают эту проблему?

Почему Excel 2013 работает в 25 раз медленнее чем 2010
Здравствуйте, уважаемые эксперты. Столкнулся с проблемой не могу решить. В Excel 2010 макрос...

Почему в одном месте работает, а в другом нет?
Доброго времени суток. Почему один код работает, а в другом сыпятся ошибки? Как бы смысл кода по...

Почему на одном компьютере работает , а на другом - нет?
Почему одна и таже программа, написанная на C++ в CodeBloks на одном компьютере, не работает на...

9
20 / 20 / 3
Регистрация: 15.02.2013
Сообщений: 59
17.03.2014, 14:50 2
lawliet93, 1 вариант из остальных 843 937: на «сервере» процесс выполняется синхронно, на «клиенте» — асинхронно.
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
17.03.2014, 15:08  [ТС] 3
JonMagon, нет-нет, на сервере все асинхронно, как и на клиенте, я уже нашел причину, но это совсем другой вопрос. Смотрите, ведь все времяисчесление завязано на тиках, правильно? Счетчик тиков это - Stopwatch, чтобы получить количество тиков за одну секунду, нужно получить значение Stopwatch.frequency и вот тут вся проблема. Я вывел это значение на сервере, и мне показало 3.124.980, потом я создал обычный консольный проект в VS и мне показало это самое число, но вот на клиенте мне показало число 10.000.000. И вот это полностю объясняет, почему счетчик на сервере такой медленный. Вопрос состоит вот в чем, как изменить это значение на сервере, чтобы оно было равным 10.000.000 ?
0
Почетный модератор
Эксперт .NET
8713 / 3665 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
17.03.2014, 15:10 4
Может быть чем-то поможет: Acquiring high-resolution time stamps
0
Эксперт .NET
16929 / 12506 / 3286
Регистрация: 17.09.2011
Сообщений: 20,743
17.03.2014, 15:49 5
Цитата Сообщение от lawliet93 Посмотреть сообщение
Тогда как на одном компе, два таймера могут работать неодинаково?
Зависит от того, что за таймеры используются и как организована работа с ними.

А так вам правильно сказали: завязывайте работу таймеров на тиках. Точнее, не работу таймеров, а инкремент счетчика.
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
17.03.2014, 15:53  [ТС] 6
kolorotur, так а если тиков на одну секунду приходится разное количество на сервере и клиенте? при чем это все на одном ПК
0
Эксперт .NET
16929 / 12506 / 3286
Регистрация: 17.09.2011
Сообщений: 20,743
17.03.2014, 16:01 7
lawliet93, говорю же, зависит от того, как у вас организована работа с таймерами на стороне клиента и сервера.
Какой класс для таймера используется там и там?
Как выглядит метод обработки тика?
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
17.03.2014, 16:16  [ТС] 8
kolorotur, вот серверная часть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static ulong timeStamp=0;
private System.Threading.Timer timer;
timer = new System.Threading.Timer(new TimerCallback(TimerWork));
timer.Change(0, 50);
private void TimerWork(object source)
        {
            timeStamp++;
            ShowTimer();
        }
private void ShowTimer()
        {
            form.timerTB.Invoke(new Del(()=>form.timerTB.Text=timeStamp.ToString()));
        }
а вот клиентская
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private Timer timer;
timer = new Timer(new TimerCallback(TimerWork));
void TimerWork(object source)
    {
        Communicator.timeStamp++;
    }
void SetTimeStamp(IServerData data)
    {
        queue.Enqueue(() =>
        {
            GetTimeStampResult result = (GetTimeStampResult) data;
            Communicator.timeStamp = result.TimeStamp;
            timer.Change(0, 50);
 
        });
    }
ну там в обеих случаях запускается System.Threading.Timer
0
Эксперт .NET
16929 / 12506 / 3286
Регистрация: 17.09.2011
Сообщений: 20,743
17.03.2014, 16:26 9
Цитата Сообщение от lawliet93 Посмотреть сообщение
вот серверная часть
В качестве эксперимента замените вызов Invoke на BeginInvoke в методе ShowTimer на стороне сервера и посмотрите на результат.
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
17.03.2014, 16:38  [ТС] 10
kolorotur, ну, то же самое, вот значение счетчиков вначале
Название: 7yKHg.png
Просмотров: 71

Размер: 9.5 Кб
разница = 27, а вот через минутку где-то
Название: 7yKKH.png
Просмотров: 71

Размер: 8.1 Кб
разница большая
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2014, 16:38
Помогаю со студенческими работами здесь

Datagridview! Почему в одном варианте работает, а в другом нет?!
надо было считать массив из *.ТХТ в датагридвью. сначала сделал так заполнение: for (int i = 0;...

Почему скрипт работает на одном и том же домене, а на другом не хочет?
почему скрипт работает на одном и том же домене, а на другом не хочет??? У меня есть рабочий...

На одном компьютере запрос работает а на другом нет. В чём может быть проблема?
Доброго времени суток. У меня возникла такая проблема, что на моём ноутбуке запрос работает...

Почему на одном проце видюха работает, а на другом нет? У обоих процов сокет lga 1155
Доброго времени суток форумчане.у меня проблема следующего характера.решил заменить свой процессор...


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

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

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