locked
Windows store app 多线程编程(二) RRS feed

  • 常规讨论

  • 大家好,

    关于Windows Streo多线程编程的问题,我们会用通过一个系列的文章来介绍。这个系列的文章会贯穿一个例程,并向大家展示,有哪些多线程的API可以使用,如何创建线程,如何去做线程同步。

    这篇文章作为这个系列的第二篇,会向大家介绍,如何在Windows Runetime 中如何替代传统的while 和sleep线程函数模式。 


    Jesse Jiang [MSFT]
    MSDN Community Support | Feedback to us

    2012年10月15日 7:07
    版主

全部回复

  • 我们用线程操作小球移动,完成了第一步,接下来,我们要考虑如何让小球一直移动呢。
    一种思路是我们用一个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


    2012年10月15日 7:08
    版主