Piszę składnik C++/CX, który ma być używany przez aplikacje sklepu Windows. Szukam sposobu, aby osiągnąć to, co Task.Delay (1000) robi w języku C#.C++ odpowiednik .NET's Task.Delay?
Odpowiedz
Można utworzyć zadanie współbieżności ::, odczekać 1000 jednostek czasu, a następnie wywołać metodę ".then" dla zadania. Zapewni to przynajmniej czas oczekiwania na 1000 jednostek czasu między czasem utworzenia zadania a czasem jego wykonania.
Stare pytanie, ale wciąż nieodebrane.
Można użyć
#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
ten będzie musiał C++11, co nie powinno stanowić problemu przy użyciu C++/CX.
Spanie i planowanie się później nie jest jednak tym samym. – sturcotte06
ja nie zamierzam twierdzić, że jest czarodziejem - Nadal jestem całkiem nowy, C++ i UWP/CX, ale co ja używam to:
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;
}
Główną zaletą. w stosunku do innych rozwiązań jest to, że:
- to non-blocking
- masz gwarantowane zostać wezwany na gwincie XAML UI
Po roku używania C++/CX mam ogólną i racjonalnie poprawną odpowiedź na to pytanie.
This link (z dokumentacji biblioteki równoległej Visual C++) zawiera fragment kodu dla funkcji zwanej complete_after(). Ta funkcja tworzy zadanie, które zakończy się po określonej liczbie milisekund. Następnie można zdefiniować zadanie kontynuacji który będzie wykonywał później:
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.
});
}
albo jeszcze lepiej, jeśli używasz Visual C++ 's coroutines możliwości wystarczy wpisać:
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.
}
- 1. Thread.Sleep vs Task.Delay?
- 2. Task.Yield() kontra Task.Delay (0)
- 3. Ile kosztuje korzystanie z Task.Delay()?
- 4. Task.Delay nigdy nie kończy się
- 5. Czy mogę używać Task.Delay jako timera?
- 6. Odpowiednik iif w C#
- 7. Odpowiednik Double.DoubleToLongBits w C#?
- 8. C# odpowiednik jQuery.parents (Type)
- 9. C odpowiednik zerknięcia fstreama
- 10. C++ odpowiednik instanceof
- 11. SAXParser odpowiednik w C#
- 12. Odpowiednik constexpr z C++?
- 13. C# odpowiednik "Not MyEnum.SomeValue"
- 14. C++ odpowiednik "super"?
- 15. C++ odpowiednik Java ByteBuffer?
- 16. C# odpowiednik perla $ _
- 17. timeout cancellationtoken vs task.delay() i timeout
- 18. Dlaczego funkcja Task.Delay() zezwala na nieskończone opóźnienie?
- 19. Dlaczego Task.Delay praca doesn `w tej sytuacji
- 20. Odpowiednik C++/CLI słowa kluczowego C# 'readonly'
- 21. Czy istnieje odpowiednik statycznego C w C#?
- 22. Objective-C odpowiednik "override" w C#
- 23. C# odpowiednik wektora C++ z przyległą pamięcią?
- 24. ANSI C odpowiednik try/catch?
- 25. Dowolny odpowiednik "rozszerzony" dla C#?
- 26. IsNullOrEmpty odpowiednik dla Array? C#
- 27. C# odpowiednik php asocjacyjnej tablicy
- 28. Odpowiednik Rubiego do C#? Operator
- 29. C# Uri.EscapeDatastring() odpowiednik dla Javy
- 30. C++ Java statyczny odpowiednik końcowy
To cykliczny pytanie, gdy w zadaniu, jak czy czekasz? –
:: WaitForSingleObjectEx (:: GetCurrentThread(), milliseconds, FALSE); –