在我的小项目中,我决定创建一个游戏,该游戏每秒更新一次用户体验点的计数器,并打印菜单并允许用户同时浏览所述菜单。更新用户体验的代码如下,并且可以独立运行。
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'函数创建一个线程,并创建一个用于请求输入的线程来使用多线程,但是问题仍然存在-钱只有在用户不断输入(按下键)时才会更新。如果他不是,那笔钱将保持不变。
任何帮助将不胜感激。
答案 0 :(得分:-1)
只有在GUI编程中才能从用户那里获得输入,而程序执行没有明显的中断。在控制台中工作时,由于明显的原因,程序必须等待才能真正拥有必要的数据,然后才能继续进行用户输入请求。
这也是为什么在声明变量之前应该初始化变量的原因;如果您不这样做,则堆栈分配的变量将包含随机(给您)数据,并且程序将无法按预期运行。从概念上讲,这与控制台一样,只是它没有自由意志的奢侈,不能简单地选择跳过等待。
从概念上讲,具有用户界面的程序通过循环操作来工作。从鼠标移动到按钮单击,发生的每个事件都会在Window过程中触发一个事件。 In the Win32 API,这只是一个switch语句,用于根据实际发生的情况检查每个可能的事件。匹配时,系统触发该事件处理程序。
应该注意的是,它只有似乎,就像没有滞后一样,因为通常图形窗口过程足够快,似乎可以即时响应。实际上,对窗口的任何操作都会触发计算机的计算,以确定该窗口的哪一部分被阻塞并且必须重新绘制,因为现在称为“无效”。
最后,我强烈建议使用其他方法更新记分板。我知道这只是一个供您尝试的虚构示例,但这意味着它对于尝试某些设计模式(即观察者模式)同样有效,甚至更好。程序不是在每个可能的时钟周期检查输入,而是浪费。当遇到这种情况时,通常会使用callback functions,在C中,这只是您传递的函数指针。这样,您不必检查一下事件何时触发,您只需让事件调用您作为参数传入的函数即可。顺便说一下,This is how Node.js的工作原理,以及尽管是单线程的却似乎可以立即完成很多工作。
如果您最近听说过有关Reactive编程的任何知识-it's been getting talked about just about everywhere in the C# community these past few months-这就是它的意思,而我提出它的原因是因为这是一个比较常见但琐碎的例子教科书的反应式编程方案。