Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Единая частота выполнения операций. 
:(
    Опции темы
MaxNJ
Дата 24.5.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) MaxNJ - 24.5.2006, 16:13
PM MAIL   Вверх
_hunter
Дата 24.5.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
MaxNJ
Дата 24.5.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если я не ошибаюсь, результат вечного цикла - загрузка цп на 100% и зависание программы... Может-быть я и ошибаюсь, но... Навряд ли... 
PM MAIL   Вверх
_hunter
Дата 24.5.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



не ошибаешся. но в чем проблема?

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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
MaxNJ
Дата 24.5.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Это сообщение отредактировал(а) MaxNJ - 24.5.2006, 16:42
PM MAIL   Вверх
HappyLife
Дата 24.5.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Засунуть цикл в отдельный поток. 
PM MAIL   Вверх
chwind
Дата 25.5.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Код

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;
}



Естественно чтобы форма не подвисала нужно вынести этот код в отдельный поток, но синхронизация между потоками увеличит погрешность измерения временного интервала 
PM MAIL   Вверх
MaxNJ
Дата 3.6.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мда... Немного затянул я с ответом...
Я вообщем-то начинающий программер, поэтому не судите строго, но я не знаю, как засунуть функцию(ии) в отдельный поток.
To chwind: это впринципе понятно, только я делал через системное время, а не через такты процессора. 
PM MAIL   Вверх
chwind
Дата 3.6.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Системное время в винде ты получаешь с большой погрешностью. Через такты можно гораздо точнее определить временные интервалы.
А на счет отдельного потока, посмотри в справке класс TThread, не пожалеешь если разберешься,  без многопоточности часто просто не обойтись. 
PM MAIL   Вверх
MaxNJ
Дата 3.6.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ок, спс всем! 
PM MAIL   Вверх
MaxNJ
Дата 6.6.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

P.S. Приоритет, ниже tpNormal делает игру до невозможности медленной, ИМХО, не вариант. 
PM MAIL   Вверх
skyboy
Дата 6.6.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



MaxNJ, делай sleep в потоке или иным образом приостанавливай его выпонение.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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