Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Events 在wxWidgets中处理事件_Events_Wxwidgets - Fatal编程技术网

Events 在wxWidgets中处理事件

Events 在wxWidgets中处理事件,events,wxwidgets,Events,Wxwidgets,我正在使用wxWidgets和OpenGL创建一个游戏引擎。我正在尝试设置一个计时器,以便游戏可以定期更新。我不想使用wxTimer,因为它可能不够精确,无法满足我的需要。我正在使用while(true)和wxStopWatch: while (true) { stopWatch.Start(); <handle events> // I need a function for this game->OnUpdate(); game->Re

我正在使用wxWidgets和OpenGL创建一个游戏引擎。我正在尝试设置一个计时器,以便游戏可以定期更新。我不想使用wxTimer,因为它可能不够精确,无法满足我的需要。我正在使用while(true)和wxStopWatch:

while (true) {
    stopWatch.Start();
    <handle events> // I need a function for this
    game->OnUpdate();
    game->Refresh();
    if (stopWatch.Time() < 1000 / 60)
        wxMilliSleep(1000 / 60 - stopWatch.Time());
}
while(true){
秒表。开始();
//我需要一个函数
游戏->更新();
游戏->刷新();
如果(秒表时间()<1000/60)
WxMillSleep(1000/60-stopWatch.Time());
}
我需要的是一个处理所有wxWidgets事件的函数,因为现在我的应用程序只是冻结

更新:没有。它在Windows上有点不稳定,在Mac上测试时,非常不稳定。显然,EVT_IDLE在Windows上的调用并不一致,在Mac上更是如此

更新2:事实上大部分都是这样。在Mac电脑上很好;我误解了Mac测试人员的回答。

我没有使用while(true)循环,而是使用EVT_IDLE,它工作得非常好

更新:没有。它在Windows上有点不稳定,在Mac上测试时,非常不稳定。显然,EVT_IDLE在Windows上的调用并不一致,在Mac上更是如此

更新2:事实上大部分都是这样。在Mac电脑上很好;我误解了Mac测试人员的回答。

  • 您是否已请求以最大速率生成空闲事件?您必须对事件调用
    RequestMore()
    ,如果不调用,则只有在处理了其他事件之后,您才会获得下一个空闲事件。请注意,持续的空闲处理将导致一个内核上100%的CPU负载
  • 即使您请求更多空闲事件,您也无法确定下一个事件需要多长时间才能到达。因此,要获得平滑动画,需要计算自上次事件以来经过的时间,并相应地更新显示
“您是否请求以最大速率生成空闲事件?您必须对该事件调用RequestMore(),如果不请求,则只有在处理了其他事件后,您才能获得下一个空闲事件。请注意,持续的空闲处理将导致一个内核上100%的CPU负载。”

这是可行的,我在图形窗口中有以下代码:-

BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
    EVT_PAINT  (MyCanvas::OnPaint)
    EVT_IDLE(MyCanvas::OnIdle)
    EVT_MOTION (MyCanvas::OnMouseMove)
END_EVENT_TABLE()
当调用my_canvas->Refresh(bClearBackground)时,画布需要更新,否则不需要更新。要做到这一点,我需要进行修改,因为程序占用了一半的cpu时间(或双核上100%的1个cpu)


RequestMore()
的参数设置为false将使应用程序仅在需要时请求更多,即仅在调用
Refresh()
时请求更多。

将此标记为解决方案。:-)(如果允许的话……我是新来的。)点击计票下面的大复选标记,你可以接受自己的答案。不需要注释标题。哦,对不起。不过,我还得再等3个小时才能这样做:我正在使用秒表来确保显示屏以恒定的速度刷新。我不希望造成100%的CPU负载,事实上,问题远没有我原来想象的那么严重,所以我可能会保持现状。
void MyCanvas::OnIdle(wxIdleEvent &event)
{
    wxPaintEvent unused;
    OnPaint(unused);
    event.RequestMore(false);
}