Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2009, 19:00   #1
ActioNs
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 38
По умолчанию Полная загрузка ЦП в цикле while

Необходимо приложение, которое будет каждые N секунд до бесконечности выполнять какое-либо действие.

Сделал так:
Код:
int32 lastUpd = 0;

	while( true )
	{
		if( GetTickCount() - lastUpd < 1000 )
			continue;

		sScriptMgr.Update();
		lastUpd = GetTickCount();
	}
Все работает, но проблема в том, что диспетчер показывает, будто данное приложение полностью занимает весь проц. В чем может быть проблема?
ActioNs вне форума Ответить с цитированием
Старый 15.08.2009, 19:07   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

А что происходит тут:
Код:
sScriptMgr.Update();
?
Может быть этот апдейт загружает процессор?
oleg kutkov вне форума Ответить с цитированием
Старый 15.08.2009, 19:12   #3
ActioNs
Пользователь
 
Регистрация: 17.07.2008
Сообщений: 38
По умолчанию

Код:
void ScriptMgr::Update()
{
	ScriptsList::const_iterator i = _scrs.begin();
	for( ; i != _scrs.end(); ++i )
	{
		if( (int32)( GetTickCount() - (*i)->LastUpdate ) > (*i)->Interval )
		{
			(*i)->Update();
			(*i)->LastUpdate = GetTickCount();
		}
	}
}
Вроде ничего ужасного. Ну в каждом скрипте есть функция Update, которая моментально выполняется и пишет лог что скрипт выполнен. Никаких задержек, секунда в секунду. А нагрузка на ЦП никогда не падает ниже 50% (у меня 2 ядра), даже при простое.
ActioNs вне форума Ответить с цитированием
Старый 15.08.2009, 19:52   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

в конце цикла while поставь sleep(0). это заставит процесс освободить свой квант времени. загруженность должна пропасть.
а вообще, при проектировании программ подобного рода, у тебя должно быть ожидание какого нибудь события, чтобы программа постоянно не выполняла непонятно что. это может быть сигнал, событие (event), или оконное сообщение
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление динамических объектов / полная очистка формы 095 Общие вопросы Delphi 3 23.04.2012 16:09
Проблема в цикле Fekla Общие вопросы C/C++ 4 28.06.2009 12:50
Ошибка в цикле Alamez Общие вопросы Delphi 2 05.04.2009 15:12
Полная очистка директории с нюансами... Kerk Общие вопросы Delphi 9 13.07.2007 15:49