Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Multithreading_Time - Fatal编程技术网

C++ 如何连续更新变量并同时等待输入?

C++ 如何连续更新变量并同时等待输入?,c++,multithreading,time,C++,Multithreading,Time,在我的小项目中,我决定创建一个每秒更新用户体验点计数器的游戏,并打印一个菜单,允许用户同时浏览所述菜单。更新用户体验的代码如下所示,它在独立环境下工作得非常好 double timerX = GetTickCount(); double timerY = GetTickCount(); while(true) { double t

在我的小项目中,我决定创建一个每秒更新用户体验点计数器的游戏,并打印一个菜单,允许用户同时浏览所述菜单。更新用户体验的代码如下所示,它在独立环境下工作得非常好

double timerX = GetTickCount();  
double timerY = GetTickCount();  
while(true)                                                                            
{

   double timerZ = GetTickCount() - timerX;
   double timerA = GetTickCount() - timerY;

       if(timerZ >= 1000) {    
        userExperience = userExperience + 1;
        timerX = GetTickCount();
    }
        if(timerA >= 1100) {
            system("CLS");
            refreshExperience();
            timerY = GetTickCount();
        }
函数'refreshExperience()'只是使用'cout'将'userExperience'变量打印到屏幕上

同时,我的程序应该能够显示主菜单GUI并请求用户输入。然而,我不想要求输入停止程序,特别是金钱更新程序,因为它是最重要的,不断更新。我尝试使用多线程,为“refreshExperience”函数创建一个线程,并创建一个请求输入的线程,但问题仍然存在——只有在用户持续输入(按键)时,钱才会更新。如果他不是,钱就不会变


任何帮助都将不胜感激

只有在GUI编程中才能从用户那里获得输入,而不会在程序执行中出现明显的中断。在控制台中工作时,每个用户输入请求都将被阻止,原因很明显,程序必须等待实际获得必要的数据后才能继续

这也是为什么您应该在声明变量之前初始化它们;如果不这样做,堆栈分配的变量将包含随机(对您而言)数据,程序将无法按预期运行。从概念上讲,这与控制台的问题相同,只是它没有自由意志的奢侈,不能简单地选择跳过等待

从概念上讲,具有用户界面的程序通过循环操作来工作。从鼠标移动到按钮单击,发生的每个事件都会触发窗口过程中的事件,它只是一个switch语句,根据实际发生的情况检查每个可能的事件。当存在匹配项时,系统将触发该事件处理程序

应该注意的是,这似乎只是没有延迟,因为通常图形窗口程序的速度足够快,似乎可以立即响应。实际上,对窗口的任何操作都会触发计算机的计算,以确定窗口的哪个部分被阻止,并且必须重新绘制,现在称之为“无效”

最后,我强烈推荐记分板更新的另一种方法。我知道这只是一个人为的例子,你可以尝试一下,但这意味着它对于尝试一些设计模式,即观察者模式,即使不是更好,也是一样好的。与程序检查每个可能的时钟周期的输入不同,它只是一种浪费。当您遇到这样的情况时,通常使用C语言中传递的函数指针。这样,您就不必检查事件何时触发,只需让事件调用作为参数传入的函数即可。顺便说一句,它是如何工作的,尽管它是单线程的,但它似乎一次完成了这么多的工作


如果你最近听说过反应式编程,这就是它所说的,我之所以提出它,是因为这是教科书上反应式编程场景中较为常见但微不足道的例子之一。

你打算如何接受用户的输入?答案可能真的不同…您需要有两个线程:GUI线程和控制台线程(用于用户输入)。@Yashas线程(到目前为止)不是解决该问题的唯一方法。请注意,在POSIX风格的操作系统(读取:非Windows)中,您可以使用非阻塞读取从
stdin
读取。“只有在GUI编程中,才能从用户那里获得输入,而不会在程序执行中出现明显的中断。“-不。这完全是错误的。您可以在轮询之间轮询输入和执行其他操作。您可以使用多个线程,这样即使输入线程被阻止,其他线程也可以执行操作。您可以使用信号异步通知事件并根据事件采取行动。等等。无需GUI!