Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更好地植入按下的按键 我现在在C++中按下“C”键时执行GATASYNCKEYSTATE事件处理程序。_C++_Events_Opengl_Onkeypress - Fatal编程技术网

更好地植入按下的按键 我现在在C++中按下“C”键时执行GATASYNCKEYSTATE事件处理程序。

更好地植入按下的按键 我现在在C++中按下“C”键时执行GATASYNCKEYSTATE事件处理程序。,c++,events,opengl,onkeypress,C++,Events,Opengl,Onkeypress,这是我的密码: bool isKeyPressed = false; void someFuntionOne() { if( GetAsyncKeyState( 'C' ) & 0x8000) { if(isKeyPressed) { isKeyPressed = false; } else { isKeyPressed = true;

这是我的密码:

     bool isKeyPressed = false;
 void someFuntionOne()
 {

     if( GetAsyncKeyState( 'C' ) & 0x8000)
    {

       if(isKeyPressed)
       {
           isKeyPressed = false;
       }
       else
       {
           isKeyPressed = true;
       }    
    }   
}

void someFunctionTwo()
{
   if(isKeyPressed)
   {
    // Do something     
   }
}
因此,基本上我想知道“C”是否被按下,而不是被按下,所以我使用布尔变量isKeyPressed来告诉我键是否在任何点被按下。如果按下,则将isKeyPressed设置为true;如果再次按下,则将isKeyPressed设置为false

我遇到的问题是,我正在运行一个庞大的OpenGL/C++程序,在一次迭代中执行整个程序需要花费大量时间,因此如果用户按下“C”键,程序可能无法及时捕获该事件,因为它仍在执行其他代码的其余部分,并且当前不在检查GetAsyncKeyState('C')&0x8000是否为的代码部分


有没有更好的方法可以检查这个事件,程序总是在任何执行时间点侦听事件的发生?如何实现这一点?

通常,无论谁将事件交付给您的应用程序,都将对其进行排队,直到应用程序有机会处理它们为止,即在每个主循环迭代结束时。因此,理想情况下,你会对该阶段的事件做出反应。一个(丑陋的)替代方案是:

bool keyWasPressed = false;
void processKeyEvent() {
     if( <C is pressed>) {
         keyWasPressed = true;
     }
}
void someFunction() {
    if(keyWasPressed) {
        keyWayPressed = false;
        // Do something     
    }
}
bool键被按下=false;
void processKeyEvent(){
如果(){
按键waspressed=true;
}
}
void函数(){
如果(按键已按下){
keyWayPressed=false;
//做点什么
}
}

您可以删除整个if/else块,并将其替换为:isKeyPressed=!按键