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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает DownloadFileAsync 
V
    Опции темы
s180
Дата 11.11.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



результаты экспериментов:

таймер работает неверно!!!!! при любом интервале, в событии timer_Elapsed я логгирую время срабатывания и каждый раз это время, то уменьшается, то увеличивается. Интервал срабатывания не выдерживается!!! За сутки разница первого срабатывания, по сравнению с последним может состоять до нескольких минут!! 

возможны ли какие-нибудь другие варианты, кроме "кривого" таймера?

Это сообщение отредактировал(а) s180 - 11.11.2009, 10:17
PM MAIL   Вверх
diadiavova
Дата 11.11.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Я, конечно, не проверял таймер в работе, но не исключаю, что причина в том, что время загрузки просто перкрывается. То есть не закончилась первая, начинается вторая и поток вынужден ждать очереди.
Если таймер в самом деле работает нечётко, то тут трудно что-либо придумать. Возможно следует вернуться к первому варианту, где загрузка будет координироваться из одного потока, а объекты задач будут только содержать информацию о том когда пора обновиться. Но реализовать это несколько сложнее. Можно попробовать укоротить интервалы (например вдвое) и всякий раз при срабатывании таймера просто сверяться со временем и определять пора обновляться или нет. Тут варианты разные, но что лучше з зависит от задачи, да и пробовать надо разные варианты, чтобы можно было выявить лучший.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
s180
Дата 11.11.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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


интервалы минимум двухминутные, а размер скачиваемого файла меньше 50Kb, думаю время не может перекрываться. Да даже дело не в этом, я просто записываю в текстовый файл время срабатывания и разница у них точно не равняется интервалу! причём, ладно бы она всегда увеличивается, так она ещё и уменьшатсья может!!! т.е. срабатывает например не через 120 секунд а через 118,560!!! как такое может быть??
PM MAIL   Вверх
diadiavova
Дата 11.11.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



s180, а если просто таймером щёлкать без закачки результат такой же?

Влюбом случае вариант, при котором щелчки таймера будут только сигналом для проверки необходимости закачки, решит проблему. Суммарная погрешность за любой промежуток времени не превысит интервала таймера.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
s180
Дата 12.11.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

Public Class TestTimer
    Dim WithEvents timer As New Timers.Timer
    Dim ltime As Integer

    Public Sub Start()
        timer.Interval = 1000
        Me.Ltime = 20
        timer.Enabled = True
    End Sub

    Private Sub timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles timer.Elapsed
        Dim fs As New Scripting.FileSystemObject
        Dim ts As Scripting.TextStream
        Me.Ltime = Me.Ltime - 1
        If Me.Ltime = 0 Then
            ts = fs.OpenTextFile("c:\1.txt", Scripting.IOMode.ForAppending, True)
            ts.WriteLine(Format(e.SignalTime, "HH-mm-ss-fff"))
            ts.Close()
            Me.Ltime = 20
        End If
    End Sub
    Public Overridable Property Ltime() As Integer
        Get
            Return ltime
        End Get
        Set(ByVal value As Integer)
            ltime = value
        End Set
    End Property
    Public Sub New(ByVal Lt As Integer)
        Me.Ltime = Lt
    End Sub
End Class


вот как проверял таймер. результаты вот какие:

17-52-00-853
17-52-20-845
17-52-40-837
17-53-00-829
17-53-20-821
17-53-40-812
17-54-00-804
...

здесь получается, что каждый раз срабатывает на 8мс раньше, в других случаях бывает, что он наоборот бежит вперёд!!

Добавлено через 2 минуты и 19 секунд
Цитата(diadiavova @ 11.11.2009,  17:40)
Влюбом случае вариант, при котором щелчки таймера будут только сигналом для проверки необходимости закачки, решит проблему. Суммарная погрешность за любой промежуток времени не превысит интервала таймера.

к сожалению не решают, вот сейчас пробую вариант, не с секундным интервалом, а с 200мс, посмотрим может там какие результаты будут.
PM MAIL   Вверх
diadiavova
Дата 12.11.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(s180 @  12.11.2009,  09:56 Найти цитируемый пост)
к сожалению не решают, вот сейчас пробую вариант, не с секундным интервалом, а с 200мс, посмотрим может там какие результаты будут. 

Судя по всему, ты не понял идею. Я говорю о варианте, при котором точность секундомера вообще не будет играть роли. Расклад примерно такой:
У тебя в классе задания должны присутствовать свойства например
NextUpdateTime As DateTime
 и
UpdateInterval As TimeSpan

Интервал таймера ставишь на величину равную предельно-допустимой погрешности работы задачи за всё время работы программы. То есть, если тебе надо чтобы за время работы программы ошибка во времени не превышала 10 секунд, то и ставь таймер на такое время.

Всякий раз, когда срабатывает таймер выполняешь следующее действие
    Проверяешь наступило ли время очередного обновления(сравниваешь текущее время со значением   
    NextUpdateTime) и если наступило, то сначала выполняешь загрузку, а затем к значению 
    NextUpdateTime прибавляешь UpdateInterval и таким образом планируешь время следующего 
    обновления.

То есть обновление будет происходить не при каждом щелчке, а только тогда, когда уже наступило запланированное время и в этом случае планируется время нового обновления.

Надеюсь объяснил понятно.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
s180
Дата 12.11.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так я так и делаю. в коде я так и написал, устанавливаю интервал "тиканья" 1с, при каждом тике уменьшаю свойство-время на 1с и когда она станет равна 0 записываю в текстовый файл. При 200мс получается вроде неплохо, но когда увеличил, время срабатывания с 20с до 5 минут, погрешность стала сотсавлят 5с!!!!!
PM MAIL   Вверх
diadiavova
Дата 12.11.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(s180 @  12.11.2009,  10:54 Найти цитируемый пост)
при каждом тике уменьшаю свойство-время на 1с и когда она станет равна 0 записываю в текстовый файл.

Это ещё зачем? Я ведь не так написал. При тике просто проверяй пора обновляться или нет. Если пора - обновляйся и устанавливай время нового обновления. И всё.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
s180
Дата 16.11.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всё. наконец-то всё отладил!! 

diadiavova, спасибо большое за помощь. Действительно, установил интервал таймера 200мс и проверял время следующего обновления, погрешность в мс составляла примерно +/- 300.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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