• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

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

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