• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

  • Автор темы 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]

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

Вложения

  • Spichki.rar
    38,3 КБ · Просмотры: 132
M

Mozzart

Здравствуйте!
Я конечно не долго заморачивался с изучением сути прблемы но на вскидку могу посоветовать) либо использовать WM_TIMER собщение от винды) ну либо если нужно просто задержать исполнение программы) то sleep)
 
M

Mariyka

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

Проблема остаётся той же.
 
M

Mozzart

Добавьте
this->RedrawWindow();
Sleep(1000);
перед:
if(pDoc->computerStep()==true) // шаг компьютера
Дело в том что Invalidate только помечает область для обновления окна. И Окно обновиться только после того как придет новое сообщение WM_PAINT
 
M

Mariyka

Ну просто громадное спасибо и респект за помощь!!! =) премного благодарен!
 
Мы в соцсетях:

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