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

Тема в разделе "MS Visual C++", создана пользователем Mariyka, 24 мар 2010.

  1. Mariyka

    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 КБ
      Просмотров:
      7
  2. Mozzart

    Mozzart Гость

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

    Mariyka Гость

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

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

    Mozzart Гость

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

    Mariyka Гость

    Ну просто громадное спасибо и респект за помощь!!! =) премного благодарен!
     
Загрузка...

Поделиться этой страницей