【问题标题】:wxWidgets program increase CPU usagewxWidgets 程序增加 CPU 使用率
【发布时间】:2011-12-05 01:59:22
【问题描述】:

我正在开发一个 wxWidgets 程序,它与使用空闲事件的 wxWiki“制作渲染循环”示例非常相似。我修改了显示面板以显示背景图像、闪烁的文本和动画。

void MyApp::onIdle(wxIdleEvent& evt)
{
    if(render_loop_on)
    {
        drawPane->paintNow();

        while(Pending())
            Dispatch();
        evt.RequestMore();
    }
}

BasicDrawPane::BasicDrawPane(wxFrame* parent) :
wxPanel(parent)
{
    wxBitmap background;
    background.LoadFile("background.png", wxBITMAP_TYPE_PNG);
    m_pBackground = new wxStaticBitmap(this, -1, background);
    m_pBackground->Show();

    m_pText = new wxStaticText(this, -1, wxT("blinking"), wxPoint(400, 10));
    m_pText->Show();
    m_bShow = false;

    wxAnimation iconAni;
    iconAni.LoadFile("animation.gif");
    m_wxIconAnimationCtrl = new wxAnimationCtrl(this, -1, iconAni);
    m_wxIconAnimationCtrl->Play();
}

void BasicDrawPane::paintNow()
{
    m_bShow = !m_bShow;
    m_pText->Show(m_bShow);
}

我添加了Dispatch功能,因为没有它,程序启动后内存和CPU使用率会线性增加,但即使使用Dispatch功能,CPU使用率也会逐渐攀升运行几个小时。只有当我单独显示背景时,CPU使用率才会稳定。

我在puppy linux上用wxWidgets 2.8.11做了测试,谁能给点建议?

【问题讨论】:

  • 好像动画会在MyApp::onIdle句柄之外产生更多的wxIdleEvent,这样就会有越来越多的空闲事件被推入队列,但是不知道怎么解决。

标签: c++ wxwidgets


【解决方案1】:

这是完全正常的,对于这个程序,cpu 使用率会增加。查看“RequestMore”的文档。这基本上循环了空闲函数,因此它被重复调用。

解决办法:

使用 wxTimer 闪烁 Text 并移除空闲功能。

编辑:

每日提示 (:D):使用 wxWidgets 2.9.x,它包含许多错误修复和改进:)。

【讨论】:

  • 感谢您的回答。但是,在我的项目中,我需要使用空闲事件循环来处理一些实时任务。如果使用 wxTimer 方法,我必须将时间间隔设置为非常短的时间,这可能 UI 非常滞后。
  • 好吧,你仍然可以将 idlefunc 用于其他东西,但你可以删除它的闪烁。至少它会减轻 CPU 的 一些 负载。您还可以更好地调整眨眼时间,还是必须尽可能快地眨眼?
  • 我去掉了闪烁的文字,发现问题主要是动画本身造成的。我试图将空闲事件与动画和 onIdle 函数区分开来。但是evt.GetId()、evt.GetTimestamp()总是返回0,没有办法过滤掉不需要的空闲事件
  • 您可以尝试使用 2.9.2 或 2.9.3 看看是否能解决问题。它被标记为“不稳定”,但确实可用。 2.9.x 代码包含许多修复和改进.. 但它只是一种解决方法。另外,您是否尝试改用 GetEventType()?
  • 更新到 2.9.2 版没有帮助,也许它不被认为是 wxWidgets 开发组的错误。 GetEventType() 总是返回相同的值,因为它们都是空闲事件。我还尝试阻止动画生成的空闲事件从 BasicDrawPane 传播到 MyApp,但是,它也会过滤掉所有其他空闲事件。
【解决方案2】:

尝试替换

evt.RequestMore();

if( ! evt.MoreRequested() )
   evt.RequestMore();

【讨论】:

  • 这不行,MoreRequested() 已经返回false,不管idle 事件来自哪里
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2020-01-27
  • 2017-12-23
  • 2010-09-21
相关资源
最近更新 更多