2012-12-10 21 views
5

私は、C++/CXコンポーネントを作成して、Windowのストアアプリで使用するようにしています。私はTask.Delay(1000)がC#で行うことを達成する方法を探しています。.NETのTask.DelayのC++に相当する?

答えて

-1

concurrency :: taskを作成し、1000時間単位を待ってから、タスクの ".then"メソッドを呼び出すことができます。これにより、タスクを作成してから実行されるまでの間に、少なくとも1000の時間単位の待機が確実に行われます。

+0

、どのようにあなたは待っていますか? –

+0

:: WaitForSingleObjectEx(:: GetCurrentThread()、ミリ秒、FALSE); –

2

古い質問ですが、未回答です。

あなたは、これはC++/CXを使用しているとき問題になることはありませんC++11を、必要になります

#include <chrono> 
#include <thread> 


std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 

を使用することができます。

+2

睡眠と後で予定を立てることは本当に同じことではありません。 – sturcotte06

0

私は、ウィザードであると主張するつもりはない - 私はまだUWPおよびC++/CXにかなり新しいですが、何私が使用していることは以下の通りである。

public ref class MyClass sealed { 
public: 
    MyClass() 
    { 
     m_timer = ref new Windows::UI::Xaml::DispatcherTimer; 
     m_timer->Tick += ref new Windows::Foundation::EventHandler<Platform::Object^>(this, &MyClass::PostDelay); 
    } 
    void StartDelay() 
    { 
     m_timer->Interval.Duration = 200 * 10000;// 200ms expressed in 100s of nanoseconds 
     m_timer->Start(); 
    } 
    void PostDelay(Platform::Object^ sender, Platform::Object ^args) 
    { 
     m_timer->Stop(); 
     // Do some stuff after the delay 
    } 
private: 
    Windows::UI::Xaml::DispatcherTimer ^m_timer; 
} 

主な利点他のアプローチの上にいることである:それはだ

  1. あなたは、XAML UIスレッド上でコールバックされることが保証している
  2. 非ブロック
0

C++/CXを使って1年後、私はこの質問に対する一般的かつ正当な答えを得ました。

This link(Visual C++ Parallel Patterns Libraryのドキュメント)には、complete_after()という関数のスニペットが含まれています。この関数は、指定されたミリ秒後に完了するタスクを作成します。あなたは、Visual C++のがcoroutines能力単に入力を使用する場合、いっそ

void MyFunction() 
{ 
    // ... Do a first thing ... 

    concurrency::create_task(complete_after(1000), concurrency::task_continuation_context::use_current) 
    .then([]() { 
     // Do the next thing, on the same thread. 
    }); 
} 

か:あなたはその後、後で実行されます継続タスクを定義することができ

一度の作業では、周期的な質問をだ
concurrency::task<void> MyFunctionAsync() 
{ 
    // ... Do a first thing ... 

    co_await complete_after(1000); 
    // Do the next thing. 
    // Warning: if not on the UI thread (e.g., on a threadpool thread), this may resume on a different thread. 
}