私は、C++/CXコンポーネントを作成して、Windowのストアアプリで使用するようにしています。私はTask.Delay(1000)がC#で行うことを達成する方法を探しています。.NETのTask.DelayのC++に相当する?
答えて
concurrency :: taskを作成し、1000時間単位を待ってから、タスクの ".then"メソッドを呼び出すことができます。これにより、タスクを作成してから実行されるまでの間に、少なくとも1000の時間単位の待機が確実に行われます。
古い質問ですが、未回答です。
あなたは、これはC++/CXを使用しているとき問題になることはありませんC++11を、必要になります
#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
を使用することができます。
睡眠と後で予定を立てることは本当に同じことではありません。 – sturcotte06
私は、ウィザードであると主張するつもりはない - 私はまだ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;
}
主な利点他のアプローチの上にいることである:それはだ
- あなたは、XAML UIスレッド上でコールバックされることが保証している
- 非ブロック
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.
}
、どのようにあなたは待っていますか? –
:: WaitForSingleObjectEx(:: GetCurrentThread()、ミリ秒、FALSE); –