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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как добиться простоя в 1 МИКРОсекунду? 
:(
    Опции темы
Benassi
  Дата 3.4.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Читал про QueryPerformanceFrequency, QueryPerformanceCounter, но ничего полезного из этого не вышло.

Код моего таймера для данного простоя таков, что эти самые микросекунды нормально отсчитываются в огромных кол-вах... вот, собственно, и код:

Код

    public class PerfCounter
    {
        Int64 freq = 0;
        Int64 _start = 0;
        Int64 finish = 0;

        public PerfCounter()
        {
            Clear();
        }

        void Clear()
        {
            QueryPerformanceFrequency(ref freq);
            freq = (long)(freq/(1000000));
        }


        public void wait(int mks)
        {
            Clear();
            freq = freq*mks;
            QueryPerformanceCounter(ref _start);
            while ((finish-_start)< freq) QueryPerformanceCounter(ref finish);
//            for (int i=0; i< mks; i++) LPTWorker.LPTIn(888);
        }

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceCounter(ref Int64 performanceCount);

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceFrequency(ref Int64 frequency);
    }
}

P.S. не советуйте, пожалуйста QNX и т.п., мне нужно считывать данные с LPT с минимальным простоем между запросами 4 мкс (Win9x/NT под .net), переключение между процессами блокирую так:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;Один не очень авторитетный программист сказал, что запрос на чтение данных с LPT занимает 1 мкс, во что я не очень верю. Пробовал Thread.Sleep(new TimeSpan(1000)), но в MSDN прочел, что малые простои игнорируются, и это будет как Sleep(0), но и это лишь гарантия минимального простоя, максимальный при этом неизвестен, к тому же таймер посылает сообщения лишь каждые 55 мс(насколько помню)... внешние устройства пожалуйста тоже не советуйте, только программно. СПАСИБО.
PM MAIL   Вверх
mr.DUDA
Дата 3.4.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



DateTime.Ticks отсчитывается в 100-наносекундных интервалах, поэтому ожидание в 1мкс можно сделать так:
Код
long timeStart = DateTime.Now.Ticks;
while (DateTime.Now.Ticks - timeStart < 10);




--------------------
user posted image
PM MAIL WWW   Вверх
Benassi
Дата 3.4.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



господин DUDA, если бы всё было бы тривиально, я бы поместил этот вопрос в раздел "для новичков".
Перед тем, как выкладывать ответ, почитайте MSDN, откомпильте. Если бы Вы проверили правильность выполнения Вашего решения, то увидели, что код :

Код

        public void wait(int mks)
        {
            Console.WriteLine(DateTime.Now.Ticks);
            long timeStart = DateTime.Now.Ticks;
            while (DateTime.Now.Ticks - timeStart < 10*mks);
            Console.WriteLine(DateTime.Now.Ticks);
        }


и вывелось бы при элементарном простое в 1000мсек (1сек), и в 2сек тот же результат ( я уж не говорю о простое в 1,2 милисекунды )... не нужно читать между строк, просто прочтите пожалуйста внимательно то, что я написал.

Спасибо за внимание, но оно не нужно, если нет решения.
PM MAIL   Вверх
mr.DUDA
Дата 3.4.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Ok, лажанулся, DateTime юзает GetSystemTimeAsFileTime который читает системное время, а оно обновляется периодически.  smile 

Да, кстати при задержке выше 16,25мс выдаёт-таки верный результат.

З.Ы. посмотрел в сырцы одного проекта, там юзается тот же QueryPerformanceFrequency/QueryPerformanceCounter. Судя по первому посту, не подходит. Есть ещё мультимедийный таймер, но его разрешение 1мс.


--------------------
user posted image
PM MAIL WWW   Вверх
altarvic
Дата 3.4.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Thread.CurrentThread.SpinWait(50) ?
здесь

Это сообщение отредактировал(а) altarvic - 3.4.2008, 13:15
PM MAIL   Вверх
Benassi
Дата 3.4.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сорри altarvic, я забыл написать, что использоваться должна платформа .NET FrameWork 1.1.
Я с этим незнаком,но там этого SpinWait нету :(
Но возможно это единственный выход из положения.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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