1

Silverlight for Windows Embeddedプロジェクトに取り組んでいて、UIスレッドで問題が発生しています。現在、アプリケーションUIスレッドは、共有メモリファイルに格納されているデータに基づいて表示を継続的に更新し、指定されたミリ秒数スリープしてからUIを再度更新する必要があります。したがって、本質的に、コードは次のようなものです。

while(true){
    UpdateUI();    //gets data from shared memory and updates graphics
    Sleep(250);
}

ただし、ご存知の方もいらっしゃると思いますが、メインのSilverlight UIスレッド内でSleep()を使用することはお勧めしません。案の定、組み込みシステム全体が20〜30分間実行するとクラッシュし、Sleep()の呼び出しが問題であると特定しました。

私が必要としているのは、UIを更新し、しばらく一時停止してからUIを再度更新し、このプロセスを無限に繰り返す別の方法です。

私の知る限り、プロジェクトの組み込みの性質により、UIスレッド(つまりJoin())でより良いソリューションとなるSleep()の明らかな代替手段のいくつかを使用することはできません。

任意の提案をいただければ幸いです!

4

1 に答える 1

0

タイマーは、ループ、特にUIスレッドにスリープがあるループよりもはるかに優れたルートです。SetTimerまたはtimeSetEventへの単純な呼び出しは、おそらくあなたが求めているものです。

int WinMain(...)
{
    // initialize xamls stuff

    // start a timer
    SetTimer(0, 0, 250, TimerProc);
    // *OR*
    timeSetEvent(250, 0, EventProc, NULL, TIME_PERIODIC | TIME_CALLBACK_FUNCTION);

    // call StartDialog or whatever to launch your UI
}

void CALLBACK TimerProc(HWND hwnd, UINT, UINT, DWORD dwTime)
{
    // this will get called every 250ms    
    UpdateUI();
}

void CALLBACK EventProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
    // this will get called every 250ms    
    UpdateUI();
}
于 2012-09-06T20:08:55.467 に答える