2011-12-05 16 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使用率が安定します。

私はwxWidgets 2.8.11でpuppy linuxでテストしましたが、誰も助言できますか?

+0

evt.RequestMore(); 

交換してみてくださいしかし、私はそれを解決する方法を知らない。 – Ruhoo2004

答えて

3

このプログラムではCPU使用率が増加するのはまったく正常です。 "RequestMore"のドキュメントを見てください。これは、基本的にアイドル関数を繰り返しループするようにループします。

ソリューション:

は、テキストを点滅するためにwxTimerを使用し、アイドル機能を削除します。

編集:デイの

ティップ(:D):使用のwxWidgets 2.9.x、それはバグ修正と改善点が多く含ま:)。

+0

あなたの答えに感謝します。しかし、私のプロジェクトでは、いくつかのリアルタイムタスクを処理するためにアイドルイベントループを使用する必要があります。 wxTimerメソッドを使用する場合、私は非常に短い時間に間隔を設定する必要があり、UIが非常に遅れている可能性があります。 – Ruhoo2004

+0

まあ、他のものにはまだidlefuncを使うことができますが、そこから点滅を取り除くことができます。少なくとも、CPUからの負荷はいくらかかかります。そしてあなたはまた、あなたの瞬きの時間を増やすことができるか、できるだけ速く点滅しなければなりませんか? –

+0

私は点滅するテキストを削除し、問題は主にアニメーション自体によって引き起こされていることを発見しました。私はアイドルイベントをアニメーションとonIdle関数から区別しようとしました。しかし、evt.GetId()、evt.GetTimestamp()は常に0を返し、不要なアイドルイベントを除外する方法はありません – Ruhoo2004

0

は、よりwxIdleEventがMyAppの外:: ONIDLEハンドルより多くのアイドルイベントをキューにプッシュされるように生成されたアニメーションのように思える

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

これは動作しません、MoreRequested()は、アイドルイベントがどこから来たかに関係なく、すでにfalseを返します – Ruhoo2004

関連する問題