2011-12-05 54 views
2

我正在使用一個wxWidgets程序,它與使用空閒事件的wxWiki「製作渲染循環」示例非常相似。我修改了顯示面板以顯示背景圖像,閃爍的文字和動畫。wxWidgets程序增加CPU使用率

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); 
} 

我加入了調度功能,因爲沒有它,程序啓動後的內存和CPU使用率會呈線性增加,但即使與調度功能,CPU使用率會在幾個小時運行後逐漸攀升。僅當我單獨顯示背景時,CPU使用情況纔會穩定。

我用小狗linux上的wxWidgets 2.8.11做了測試,任何人都可以提醒它嗎?

+0

好像動畫將產生更多的wxIdleEvent外MyApp的:: ONIDLE手柄,使越來越多的閒置事件將被推到隊列中更換

evt.RequestMore(); 

,但我不知道如何解決它。 – Ruhoo2004

回答

3

這是完全正常的,這個程序的CPU使用率增加。看看「RequestMore」的文檔。這基本上循環閒置功能,所以它被重複調用。

解決方案:

使用wxTimer爲閃爍的文本和刪除空閒功能。

編輯:

蒂普日的(:d):使用wxWidgets的2.9.x,它包含了很多錯誤修正和改進了:)。

+0

感謝您的回答。但是,在我的項目中,我需要使用空閒事件循環來處理一些實時任務。如果使用wxTimer方法,我必須將時間間隔設置爲很短的時間,並且UI可能會非常滯後。 – Ruhoo2004

+0

那麼,你仍然可以使用idlefunc來處理其他東西,但是你可以從中刪除閃爍。至少它會從CPU中卸載*一些*加載。你也可以更好地控制你的眨眼,還是必須儘快閃爍? – 2011-12-06 01:02:10

+0

我刪除了閃爍的文字,發現問題主要是由動畫本身引起的。我試圖從動畫和onIdle函數中區分空閒事件。但是evt.GetId(),evt.GetTimestamp()總是返回0,並且沒有辦法過濾不需要的空閒事件 – Ruhoo2004

0

嘗試用

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

不工作,無論閒置事件來自哪裏,MoreRequested()都已返回false – Ruhoo2004