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

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

  1. Mariyka

    Mariyka Гость

    Репутация:
    0
    Сразу к сути. Есть программа - игра "Спички".

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

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

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


    <!--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 Гость

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

    Mariyka Гость

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

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

    Mozzart Гость

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

    Mariyka Гость

    Репутация:
    0
    Ну просто громадное спасибо и респект за помощь!!! =) премного благодарен!
     
Загрузка...
Похожие Темы - не работает таймер
  1. abdurtim
    Ответов:
    8
    Просмотров:
    275
  2. ghostphisher
    Ответов:
    26
    Просмотров:
    679
  3. seoman2
    Ответов:
    5
    Просмотров:
    282
  4. lemuriez
    Ответов:
    0
    Просмотров:
    244
  5. zehrx
    Ответов:
    5
    Просмотров:
    497

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