2012-09-15 82 views
1

好了,我的工作在菜单上和它的工作原理是每3秒一个新的选择出现,但我试图让这个有3秒钟内,我可以按一个按钮来激活的东西现在看这里:C++等待和睡眠问题

dvar(-1, 0, "e \"Prestige and rank settings\""); 
Sleep(35); 
dvar(-1, 0, "c \"Set prestige one\""); 
if (Key_Down(0, 0x02)) { 
    dvar(-1, 0, "c \"Setting 1st prestige, will be kicked\""); 
    Sleep(1000); 
    dvar(-1, 0, "c \"^43\""); 
    Sleep(1000); 
    dvar(-1, 0, "c \"2\""); 
    Sleep(1000); 
    dvar(-1, 0, "c \"^41\""); 
    Sleep(1000); 
} 
Sleep(3000); 

上面的问题是后“设置威望一个”它跳到下一个睡眠(3000)和下一个选项,现在我需要找到一种方法,能够依旧使用,如果陈述女巫是在3秒内的一个按钮,而不是它睡觉的线程和使按钮不可用,除非你在文本加载之前按下它。

所以差不多就是我需要做的是,而再睡觉线程,而不是让它等待那3秒钟,我仍然可以使用if语句。

这是一个DLL运行在一个XBOX360

利布斯目前使用

#include "stdafx.h" 
#include <stdio.h> 
#include <string> 
#include <iostream> 
+0

在什么操作系统? (如果是一些的Posix或Linux系统,你需要'sleep'或'usleep',也许'poll') –

+4

这是一个基于事件的编程问题。有许多事件循环的库应该能够解决您的问题。你正在使用什么库来执行你正在编写的这个应用程序?也许有人能够正确回答你的问题。 – Horus

+0

我已经更新了它它是一个XBOX360和我不是100%,如果任何额外的库可以因此它添加了一台Xbox。 –

回答

0

我想你会尝试编程与以下的头脑::

  1. 事件驱动。
  2. 多线程。使用系统计时器事件服务。
  3. 基于状态机。

伪代码是这样的:

int State = IDLE; 
dvar(-1, 0, "e \"Prestige and rank settings\""); 
Sleep(35); 
dvar(-1, 0, "c \"Set prestige one\""); 

while (1) 
{ 
    switch (SomeEvent) 
    { 
    case ON_Key_down: 
     if (Key == 0x02) 
     { 
      if (State == IDLE || State == KEY_PRESSED_SET1stPRESTIGE_Finish) 
      { 
       State = KEY_PRESSED_SET1stPRESTIGE_1stSTEP; 
       dvar(-1, 0, "c \"Setting 1st prestige, will be kicked\""); 

       Timer_Event_AfterMS(1000); // make request event after 1sec to system alarm service 
      } 
      else 
      { 
       // ignore do something 
      } 
     } 
     break; 
    case ON_Timer_SomeSec: 
     if (State == KEY_PRESSED_SET1stPRESTIGE_1stSTEP) 
     { 
      dvar(-1, 0, "c \"^43\""); 
      State = KEY_PRESSED_SET1stPRESTIGE_2ndSTEP; 
      Timer_Event_AfterMS(1000); // make request event after 1sec to system alarm service 
     } 
     else if (State == KEY_PRESSED_SET1stPRESTIGE_2ndSTEP) 
     { 
      dvar(-1, 0, "c \"2\""); 
      State = KEY_PRESSED_SET1stPRESTIGE_3rdSTEP; 
      Timer_Event_AfterMS(1000); // make request event after 1sec to system alarm service  
     } 
     else if (State == KEY_PRESSED_SET1stPRESTIGE_3rdSTEP) 
     { 
      dvar(-1, 0, "c \"^41\""); 
      State = KEY_PRESSED_SET1stPRESTIGE_4rdSTEP; 
      Timer_Event_AfterMS(1000); // make request event after 1sec to system alarm service  
     } 
     else if (State == KEY_PRESSED_SET1stPRESTIGE_4rdSTEP) 
     { 
      State = KEY_PRESSED_SET1stPRESTIGE_Need3SEC; 
      Timer_Event_AfterMS(3000); // make request event after 3sec to system alarm service  
     } 
     else if (State == KEY_PRESSED_SET1stPRESTIGE_Need3SEC) 
     { 
      State == KEY_PRESSED_SET1stPRESTIGE_Finish; 
     } 
     break; 
    default: 
     break; 
    } 
}