Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Единая частота выполнения операций.


Автор: MaxNJ 24.5.2006, 16:12
   Хотелось бы узнать, как добиться того, чтобы, например, операция a=a+1 выполнялась ровно 100 раз в секунду.
   Понятно, что обычного таймера с интервалом в 10 в таком случае не хватит. Например, на моем компьютере за секунду таких операций выполняется от 15 до 64, как бы сделать зависимость между временем и частотой выполнения операций? 

Автор: _hunter 24.5.2006, 16:23
запусти вечный цикл вместо таймера.
в этом цикле вместо Sleep' а крути еще один цикл. в нем смотри сколько времени прошло с начала "кручения" 

Автор: MaxNJ 24.5.2006, 16:27
Если я не ошибаюсь, результат вечного цикла - загрузка цп на 100% и зависание программы... Может-быть я и ошибаюсь, но... Навряд ли... 

Автор: _hunter 24.5.2006, 16:40
не ошибаешся. но в чем проблема?

P.S.
во втором цикле Sleep(0) можеш приписать 

Автор: MaxNJ 24.5.2006, 16:41
Что же, я попробовал, скорость выполнения операций гораздо больше, чем при таймере, но форма не реагирует на нажатие клавиш, все что находится на ней меняется только при использовании функции Refresh(). Как это можно исправить?  

Автор: HappyLife 24.5.2006, 17:39
Засунуть цикл в отдельный поток. 

Автор: chwind 25.5.2006, 09:22
Смирись что точно время в Винде ты не измеришь но приблизительно задать временной интервал (с точностью до микросекунд) можно так

Код

void mcsleep(DWORD time)//время задержки в микросекундах
{
    unsigned __int64 count1 = GetTick();
    for(;;)
    {
       if( (GetTick() - count1)/count_per_microsec > time ) break;
    }
}
unsigned __int64 TForm1::GetTick() //функция возвращает сколько тиков сделал проц с момента включения
{
  unsigned __int64 cpu_count;
  DWORD h32, l32;
  asm{
    RDTSC
    mov l32, eax
    mov h32, edx
 }
 cpu_count = h32;
 cpu_count <<= 32;
 cpu_count += l32; //вроде правильно :)
return cpu_count;
}



Естественно чтобы форма не подвисала нужно вынести этот код в отдельный поток, но синхронизация между потоками увеличит погрешность измерения временного интервала 

Автор: MaxNJ 3.6.2006, 17:32
Мда... Немного затянул я с ответом...
Я вообщем-то начинающий программер, поэтому не судите строго, но я не знаю, как засунуть функцию(ии) в отдельный поток.
To chwind: это впринципе понятно, только я делал через системное время, а не через такты процессора. 

Автор: chwind 3.6.2006, 19:01
Цитата(MaxNJ @  3.6.2006,  17:32 Найти цитируемый пост)
To chwind: это впринципе понятно, только я делал через системное время, а не через такты процессора.  

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

Автор: MaxNJ 3.6.2006, 19:02
ок, спс всем! 

Автор: MaxNJ 6.6.2006, 10:49
Так-с... Тема пока в действии, потому что возникла очередная проблемка.

Я делаю реал-тайм игру(только не крупный проект, а мелочь для себя, так сказать), и там похоже не очень подходит отдельный поток с бесконечным циклом. Дело в том, что для такой маленькой игры не должно быть характерным загрузка цп так, что в это время практически нельзя ничего делать и к тому-же тормоза в самой игре... Может как-нибудь можно обойти тормоза, связанные с бесконечным циклом в потоке или есть какой-либо другой способ?

P.S. Приоритет, ниже tpNormal делает игру до невозможности медленной, ИМХО, не вариант. 

Автор: skyboy 6.6.2006, 10:57
MaxNJ, делай sleep в потоке или иным образом приостанавливай его выпонение.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)