2012-12-10 44 views
5

मैं विंडो के स्टोर ऐप्स द्वारा उपभोग करने के लिए एक सी ++/सीएक्स घटक लिख रहा हूं। मैं कार्य को पूरा करने का एक तरीका ढूंढ रहा हूं। डेले (1000) सी # में करता है।सी ++ .NET के कार्य के बराबर। डेले?

उत्तर

-1

आप एक समरूपता :: कार्य बना सकते हैं, 1000 समय इकाइयों की प्रतीक्षा करें और फिर कार्य के लिए ".then" विधि को कॉल करें। इससे यह सुनिश्चित होगा कि आपके द्वारा कार्य को बनाए जाने के समय और इसे निष्पादित किए जाने के बीच 1000 समय इकाइयों की प्रतीक्षा कम से कम हो।

+0

एक चक्रीय सवाल है कि, एक बार काम में, कैसे क्या आप प्रतीक्षा करते हैं ?? –

+0

:: WaitForSingleObjectEx (:: GetCurrentThread(), मिलीसेकंड, गलत); –

2

पुराना प्रश्न, लेकिन अभी भी अनुत्तरित नहीं है।

आप का उपयोग

#include <chrono> 
#include <thread> 


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

यह C++11 है, जो एक समस्या है जब सी ++/CX का उपयोग नहीं किया जाना चाहिए की आवश्यकता होगी कर सकते हैं।

+2

सोना और बाद में निर्धारित होना वास्तव में वही बात नहीं है। – sturcotte06

0

मैं एक जादूगर होने का दावा करने के लिए नहीं जा रहा हूँ - मैं अभी भी काफी UWP के लिए नया हूँ और सी ++/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. यह गैर अवरुद्ध
  2. आप XAML यूआई धागे पर वापस बुलाया होने की गारंटी रहे हैं
0

सी ++/सीएक्स का उपयोग करने के एक वर्ष बाद, मेरे पास इस प्रश्न का सामान्य और उचित सही उत्तर है।

This link (विज़ुअल सी ++ समांतर पैटर्न लाइब्रेरी प्रलेखन से) में पूर्ण_after() नामक फ़ंक्शन के लिए एक स्निपेट शामिल है। वह फ़ंक्शन एक कार्य बनाता है जो मिलीसेकंड की निर्दिष्ट संख्या के बाद पूरा हो जाएगा। तुम तो एक निरंतरता कार्य है कि बाद में निष्पादित करेंगे परिभाषित कर सकते हैं:

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. 
    }); 
} 

या बेहतर अभी तक, अगर आप विजुअल C++ के coroutines क्षमताओं बस टाइप का उपयोग करें:

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. 
}