|
Странное поведение потока
|
|||
---|---|---|---|
#18+
PallarismyauchaВообще-то, все это я делаю в WPF. Может он свой отпечаток накладывает?! Thread.Sleep гарантирует, что поток уснет на период, не меньший, чем ты указал. Но он не гарантирует, что поток проснется немедленно после указанного периода Не видел в разьяснениях про квант времени - Виндовс не реал тайм система, потому, что всем запущеным потокам выдает по 15 милисекунд на поработать. Потом отдает время следующему потоку. Если система не занята, то высока вероятность, что следующий поток это будет тот же самый. Thread.Sleep(0) отпускает квант, и время передается другому потоку. Thread.Sleep(0) == Thread.Sleep(15) по функциональности. По поводу реал-тайм систем - на дотнете их делать можно, но при помощи негативной логики - вы должны писать проверку в цикле, выполнение какого-нибудь условия на внешнем устройстве (установленный бит или типа того), и только после этого давать следующую команду. Быть уверенным в интервалах нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 09:47 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
myauchaНе тупо читаю, а с привязкой ко времени. Файл сформирован и зафиксирован, новые данные в него не поступают. А если быть точным, то файлов несколько и в каждом свои технические события со временем возникновения. Я, по сути, их просто проигрываю Roman Mejtesтак же есть SystemFileWatcher который может возбуждать событие, если файл был изменён. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 11:04 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
Cat2myauchaНе тупо читаю, а с привязкой ко времени. Файл сформирован и зафиксирован, новые данные в него не поступают. А если быть точным, то файлов несколько и в каждом свои технические события со временем возникновения. Я, по сути, их просто проигрываю Roman Mejtesтак же есть SystemFileWatcher который может возбуждать событие, если файл был изменён. И к чему это?! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 11:33 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
petalvikmyauchaя ... писал код аналогичный следующему for (int i = 0; i<1000; i++) Thread.Sleep(1) и он отрабатывал за секунду Брехня. Если только кто-то не пошаманил с функцией timeBeginPeriod. тынц В общем, путем нехитрых экспериментов (проверил практически все, что мне тут посоветовали) самым стабильным решением оказалось применение такой вот конструкции TimeBeginPeriod(1); Thread.Sleep(1); TimeEndPeriod(1); За ссылку отдельное спасибо petalvik-у. Без TimeBeginPeriod у меня тоже работало, но только при запущенном браузере Chrome. Закрываешь хром - Sleep виснет. Но! Даже при закрытом хроме, если в WPF приложении нажать на кнопку (просто обычный Button, помещенный на форму без всякой логики), то Sleep тоже начинает работать стабильно. Видимо WPF и хром у себя где-то используют TimeBeginPeriod тоже. Кстати, читал попутно, что Thread.Sleep(0) тождественно Thread.Sleep(15). У меня при замерах Thread.Sleep(0), в большинстве случаев, вообще отрабатывал без задержки, то есть цикл с 1000 итераций и Sleep(0) занимал 0 мсек вне зависимости от того запущен браузер или нет, есть WPF или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 12:22 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
myauchaКстати, читал попутно, что Thread.Sleep(0) тождественно Thread.Sleep(15). У меня при замерах Thread.Sleep(0), в большинстве случаев, вообще отрабатывал без задержки, то есть цикл с 1000 итераций и Sleep(0) занимал 0 мсек вне зависимости от того запущен браузер или нет, есть WPF или нет. И о чем это говорит, по вашему? Вероятность. Если даже отдали квант в середине цикла - вы этого не заметите. Просто имейте в виду, что ваша программа идет вперед маленькими кусочками. О моменте перерыва она не знает. Хотите замерять точнее - надо использовать Stopwatch. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 14:34 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
Я вот ещё что хочу сказать. Если нужно выполнять некое действие тысячу раз в секунду (в среднем один раз в одну миллисекунду), то можно поступать так, как делают в играх для программирования плавного движения. Засекаем время входа при начале очередной итерации цикла, выполняем действие. При следующей итерации сравниваем текущее время с запомненным: если прошла всего одна миллисекунда - выполняем наше действие один раз. Прошло 50 мс - выполняем действие 50 раз. Таким образом можно добиться выполнения действия нужное количество раз. Однако интервалы между ними будут разными. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 16:19 |
|
Странное поведение потока
|
|||
---|---|---|---|
#18+
petalvikЗасекаем время входа при начале очередной итерации цикла, выполняем действие. При следующей итерации сравниваем текущее время с запомненным: если прошла всего одна миллисекунда - выполняем наше действие один раз. Прошло 50 мс - выполняем действие 50 раз.. Дифференцирование для чайников :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2015, 18:00 |
|
|
start [/forum/topic.php?fid=20&msg=38960753&tid=1401548]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 373ms |
total: | 493ms |
0 / 0 |