我们用线程操作小球移动,完成了第一步,接下来,我们要考虑如何让小球一直移动呢。
一种思路是我们用一个while循环,一直调用小球移动的函数,但是while循环执行的速度太快了。我们要加入Sleep函数去等待。
但在Windows Store App 中Sleep函数是不可以使用的。无论是在C++或者.NET的环境,(std::thread 和std::this_thread::sleep_for 可以编译通过,不过在运行时会崩溃,Windows Store App在设计的时候是非阻塞的,所以像Sleep这样的API就不允许使用了)
如何解决这个问题? Windows Store app 提供了Windows::UI::Xaml::DispatcherTimer和Windows::System::Threading::ThreadPoolTimer 来解决这个问题。下面我们演示如何用这个类实现sleep的功能
我们再加入一个函数Usedispatchertimer
void MainPage::Usedispatchertimer()
{
Windows::UI::Xaml::DispatcherTimer^ tempdispatchertime=ref new DispatcherTimer();
Windows::Foundation::TimeSpan time;
time.Duration = 10000;
tempdispatchertime->Interval=time;
auto timerDelegate = [this](Object^ e,Object^ ags)
{
auto uiDelegate = [this]()
{
double x=Canvas::GetLeft(round1);
Canvas::SetLeft(round1,x-3);
};
Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler(uiDelegate));
};
tempdispatchertime->Tick+=ref new EventHandler<Object^>(timerDelegate);
tempdispatchertime->Start();
}
在这段代码中tempdispatchertime->Interval 是设置时间间隔的以100纳秒为单位。
DispatcherTimer需要的Handler不同于ThreadPool::RunAsync,所以Lambda表达式的传入参数要改成Object^ e,Object^ ags
用tempdispatchertime->Tick 添加句柄,当然句柄也可以减,我们后面再说。
然后tempdispatchertime->Start() 开始执行。
这样Lambda表达式里面的内容就会以Interval的时间间隔,反复执行。这样的效果就类似于while循环+sleep
执行之后我们看到小球一直都在向左走,甚至走出边界。
Jesse Jiang [MSFT]
MSDN Community Support | Feedback to us
