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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2010, 22:30   #1
shuhermayer
Пользователь
 
Регистрация: 20.07.2007
Сообщений: 14
Восклицание не работает таймер задержки

Сразу к сути. Есть программа - игра "Спички".

на экране рисуем определённое кол-во спичек. Человек играет против компа. Пользователь выбирает кол-во спичек, которое следует убрать, затем "обновляем" экран, ход компа.

Проблема в том, что спички убираются СРАЗУ ЖЕ и те, которые выбрал пользователь и комп. Между этими действиями требуется сделать задержку по времени.

Использую следующую функцию таймера:

Код:
void WaitTimer(int time)
{
int period=0;
LARGE_INTEGER milsec1;
LARGE_INTEGER milsec2;
QueryPerformanceCounter(&milsec1);
LARGE_INTEGER tactInsec;
int tactInMicsec;
QueryPerformanceFrequency(&tactInsec);
tactInMicsec=tactInsec.QuadPart/1000;
while(period<time)
{
QueryPerformanceCounter(&milsec2);
period=milsec2.QuadPart/tactInMicsec-milsec1.QuadPart/tactInMicsec;
}
}
Но не работает.

В чём кроется причина, помогите решить проблему, очень надо.. впрочем, как всегда..

кусок исходника тут:

Код:
void CSpichkiView::OnLButtonDown(UINT nFlags, CPoint point)  // нажатие на левую кнопку мыши
{
	CSpichkiDoc* pDoc = GetDocument(); // получение указателя на класс CDocument
	ASSERT_VALID(pDoc);

	CRect rc;
	rc.SetRect(30,300,120,330);
	if(rc.PtInRect(point)) // если нажали  на первую кнопку
	{
		if(pDoc->numSpichek==1)
		{
			pDoc->numSpichek-=1;
			
			Invalidate();
                                 WaitTimer(1000);                 //таймер!!
			MessageBox("You win!");
			pDoc->StartNewGame();	
		}
		else
		{
			
			pDoc->numSpichek--;	
			Invalidate();
			WaitTimer1(1000);
			if(pDoc->computerStep()==true) // шаг компьютера
				{   
					
					Invalidate();
					
					MessageBox("You lose!");
					pDoc->StartNewGame();	
				}
				else {
			Invalidate();

			}

		}
кстати, если сразу после вызова функции таймера поставить MessageBox, после закрытия этого мессаджбокса таймер работает!!!


И ещё используемый метод computerStep(), на всякий случай выкладываю:

Код:
bool CSpichkiDoc::computerStep() // шаг компа
{
	SetModifiedFlag(1); // взводим флаг того, что документ не сохранен - чтобы при выходе спрашивал "сохранить или нет"
	int x;
	if(numSpichek==1||numSpichek==2||numSpichek==3) // если осталось 3 2 или 1 спичка - комп выиграл
		return true;



	x=rand()%3;
	if(x==0)
		numSpichek--;		
	if(x==1)
		numSpichek-=2;
	if(x==2)
		numSpichek-=3;		

	return false; 
}
shuhermayer вне форума Ответить с цитированием
Старый 24.03.2010, 22:35   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

если нужна простая задержка, то может быть подойдет ф-я Sleep(млсек), а если ты пишешь в BC++ , там есть такой компонент TTimer
в обработчик его пишешь всё что надо сделать. Он будет выполнять твой код и приостанавливаться на заданное время.
NiCola999 вне форума Ответить с цитированием
Старый 24.03.2010, 23:02   #3
shuhermayer
Пользователь
 
Регистрация: 20.07.2007
Сообщений: 14
По умолчанию

пишу на Microsoft Visual Studio 2008

попробовал Sleep();
сама задержка работает, но не в том месте. после действия пользователя должно происходить обновление экрана, также как после действия компа, уже куда только не вставлял задержку, она происходит или вообще до всех обновлений или после сразу двух обновлений.

Может дело в архитектуре?

Повторюсь, всё почему-то работает если тупо между действиями дополнительно вызвать Мессаджбокс, убирается одна спичка, которую вытащил пользователь, потом всплывает мессаджбокс, потом задержка, потом второе обновление экрана.
shuhermayer вне форума Ответить с цитированием
Старый 25.03.2010, 23:05   #4
shuhermayer
Пользователь
 
Регистрация: 20.07.2007
Сообщений: 14
По умолчанию

может кто посмотрит проект? могу скинуть куда скажете

кстати, возможна ли проблема из-за может неправильной работы или использования Invalidate(); ?
shuhermayer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
время задержки приема байт varelik Общие вопросы Delphi 4 14.12.2009 09:58
Неимоверные задержки на расшареных принтерах crazy horse Операционные системы общие вопросы 12 31.08.2009 08:22
LPT и 1 мкс задержки! MadGest Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 05.04.2009 13:59
метод для задержки времени wwwbaltazor JavaScript, Ajax 2 23.03.2009 22:30
Временные задержки dgoc Помощь студентам 1 05.12.2007 05:03