处理wxWidgets中的事件

时间:2009-07-15 17:49:41

标签: events wxwidgets

我正在使用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());
}

我需要的是一个能够处理所有wxWidgets事件的函数,因为现在我的应用程序只是冻结了。

更新:事实并非如此。它在Windows上略显生涩,在Mac上测试时,它非常生涩。显然,EVT_IDLE在Windows上不会被一致地调用,甚至在Mac上也不会被调用。

UPDATE2:它实际上大部分都是。它在Mac上很好用;我误解了我的Mac测试者的回复。

3 个答案:

答案 0 :(得分:1)

我没有使用while(true)循环,而是使用EVT_IDLE,它完美无缺。

更新:事实并非如此。它在Windows上略显生涩,在Mac上测试时,它非常生涩。显然,EVT_IDLE在Windows上不会被一致地调用,甚至在Mac上也不会被调用。

UPDATE2:它实际上大部分都是。它在Mac上很好用;我误解了我的Mac测试者的回复。

答案 1 :(得分:1)

“你是否要求以最大速率生成空闲事件?你必须在事件上调用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-&gt; Refresh(bClearBackground)时,需要更新画布,否则不需要更新。要做到这一点,我需要做一个修改,因为程序占用了一半的CPU时间(或决斗核心上1个cpu的100%)。

void MyCanvas::OnIdle(wxIdleEvent &event)
{
    wxPaintEvent unused;
    OnPaint(unused);
    event.RequestMore(false);
}

RequestMore()的参数设置为false会使应用仅在需要时询问更多内容,即仅在调用Refresh()时才会询问。

答案 2 :(得分:0)

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