我正在使用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,无限重复此过程。
据我所知,项目的嵌入性质不允许我使用Sleep()的一些明显替代品,这将是UI线程中更好的解决方案(即Join())。
任何建议都将不胜感激!
答案 0 :(得分:0)
定时器是一个好得多的路径,然后是循环,尤其是在UI线程中具有Sleep的循环。对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();
}