![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SKN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 23.10.2004 Репутация: нет Всего: нет |
Просто Sleep не проходит, надо стопорить прогамму на 1мс, с ошибкой не более 50мкс. Подозреваю, что точность установки Sleep >10мс происходит из-за многопоточности виндов, где-то читал, что время переключения между потоками - 1мс. Если этот так, то вопрос ставится так: как сделать мою программу на какое-то время единственным потоком, чтобы никакие опросы CDROM'а , сети, дисководов и пр. мне не мешали. Спасибо.
|
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Читай тут
ttp://www.sources.ru/NonCGI/Forum2/HTML/001250.html и тут http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=4&m=82812 -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
SKN
Sleep - переключает треды. Можно просто использовать запись или чтение в какой-нить порт, но винда по-моиму это запрещает. Надо на уровень ядра спускаться. Ипользовать для задержки запись в какой-нить порт, и замерять при помощи QueryPerformanceFrequency и QueryPerformanceCounter Это сообщение отредактировал(а) bel_nikita - 24.10.2004, 21:53 |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
SKN
Посмотри в MSDNе описание критических секций. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Mad, я думал, что критические секции - для синхронизации потоков...
Как тут их можно применить ? SKN, 1) Можно остановить в системе все потоки: CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD...), каждый поток остановить (SuspendThread). Чтобы останавливать системные потоки, надо получить привилегию "SeDebugPrivilege"... Либо: Просто поставить приоритет текущего процесса/потока = Real-Time / Time-Critical (SetPriorityClass / SetThreadPriority) (эффект от обоих способов почти одинаковый) 2) Использовать QueryPerformanceFrequency и QueryPerformanceCounter. Я проверял на двух компах, на одном частота таймера = 3,58 МГц, на другом = 2,1 МГц. Соответственно, можешь посчитать, с какой точностью можно отсчитывать время (подели 1 на частоту)... Либо: Более точные измерения - это через RDTSC. Частота проца в сотни раз больше частоты таймера. Хотя эта точность уже будет излишней... Главная проблема - переключения задач, из-за которых для потока получаются "провалы" во времени... Если сделать 1 и 2, то будет еще одна бяда: всё "встанет": замерзнет звук и экран, клава и мышь заглохнут и т.д, пока твой поток будет в цикле мерять время... Таким способом я добился на своём компе: среднее отклонение 50 мкс (как раз), но встречаются "заскоки" - 210 мкс (возникающие из-за переключения задач)... -------------------- С уважением, г-н Посол. |
|||
|
||||
| SKN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 23.10.2004 Репутация: нет Всего: нет |
Спасибо всем за ответы, завтра попробую
|
|||
|
||||
| Adil' |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 6 Всего: 15 |
SKN, распиши проблему по-подробнее, может в самом деле можно ее решить как то более тривиально? -------------------- Удачи |
|||
|
||||
| Sep. |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 22.7.2004 Репутация: нет Всего: 6 |
а где они находятся? какой хидер подключить надо в Билдере 6?
у меня сходная проблема: программа управляем шаговым двигателем. Так даже 1мс не добится. Если делаю что то типа
то получается что sleep(1) выполняется 15мс! То же самое и с Now() и clock() Подскажите как хотя бы 1мс получить в билдере? Спасибо. --------------------
Syn - TotalCommander lister plugin | SynTree - coders sourcebook |
||||||
|
|||||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Sep.
Не ту ты операционку выбрал, чтобы двигателями управлять...
windows.h попробуй -------------------- Да. Именно так. |
|||
|
||||
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
Можно попробовать что-нить типа этого:
Жесткая штука Это сообщение отредактировал(а) zhgutov - 26.4.2005, 12:15 --------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| Sep. |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 22.7.2004 Репутация: нет Всего: 6 |
zhgutov спасибо что выручил, поставил тебе + Добавил в timer.cpp :
А GetTickCount() оказался в winbase.h --------------------
Syn - TotalCommander lister plugin | SynTree - coders sourcebook |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |