не работает таймер задержки

  • Автор темы Автор темы Mariyka
  • Дата начала Дата начала
M

Mariyka

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

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

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

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


<!--shcode--><pre><code class='# CPP'>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;
}
}[/CODE]


Но задержка не работает.

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

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


<!--shcode--><pre><code class='# CPP'>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();

}

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


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



<!--shcode--><pre><code class='# CPP'>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;
}[/CODE]

Прилагаю архив проекта без добавления таймера, указанного выше..
 

Вложения

Здравствуйте!
Я конечно не долго заморачивался с изучением сути прблемы но на вскидку могу посоветовать) либо использовать WM_TIMER собщение от винды) ну либо если нужно просто задержать исполнение программы) то sleep)
 
да, есть такое вариант, но он тоже не работает. пробовал слип, но куда его не вставляй, задержки между "исчезновением" спички после выбора пользователем и "изсчезновением" спички после действия компа - нет. т.е. если пользователь убирает 1 спичку, потом комп убирает 2 спички, на экране убираются сразу 3 спичку, куда ни суй слип, таймер с задержкой, как его ни на зови.

Проблема остаётся той же.
 
Добавьте
this->RedrawWindow();
Sleep(1000);
перед:
if(pDoc->computerStep()==true) // шаг компьютера
Дело в том что Invalidate только помечает область для обновления окна. И Окно обновиться только после того как придет новое сообщение WM_PAINT
 
Ну просто громадное спасибо и респект за помощь!!! =) премного благодарен!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!