आप C ++ प्रोग्राम में समयबद्ध देरी कैसे जोड़ते हैं?


93

मैं C ++ प्रोग्राम में समयबद्ध देरी को जोड़ने की कोशिश कर रहा हूं, और सोच रहा था कि क्या किसी के पास कोई सुझाव है जो मैं कोशिश कर सकता हूं या मैं देख सकता हूं?

काश मेरे पास इस बारे में अधिक जानकारी होती कि मैं इस समयबद्ध विलंब को कैसे लागू कर रहा हूं, लेकिन जब तक मुझे समय की देरी को जोड़ने के बारे में अधिक जानकारी नहीं है, तब तक मुझे यकीन नहीं है कि मुझे इसे लागू करने का प्रयास कैसे करना चाहिए।


2
यह निर्भर करता है कि आपके पास कौन सा प्लेटफ़ॉर्म (OS) और कौन सी लाइब्रेरी उपलब्ध है।
स्कॉट लैंगहम

जवाबों:


80

Win32: Sleep(milliseconds)तुम क्या हो

यूनिक्स: usleep(microseconds)आप क्या चाहते हैं।

नींद () में केवल कुछ सेकंड लगते हैं जो अक्सर बहुत लंबा होता है।


3
वहाँ भी है nanosleep () अगर usleep () आपको पर्याप्त समाधान नहीं देता है।
क्रिस्टोफर जॉनसन

9
ध्यान रखें कि इन फ़ंक्शंस का तर्क मिनिमम स्लीप बार है, और इस बात की गारंटी नहीं है कि यदि कोई अन्य प्रक्रिया उस समय CPU को हॉगिंग कर रही है, तो आप तुरंत वापस आ जाएंगे।
बिलजमदेव

1
@ रीचर्ड हैरिसन: मुझे नींद () काम करने के लिए कौन से हेडर को शामिल करना है?
Overflowh

12
Win32 स्लीप पर @Overflowh () windows.h में है; यूनिक्स नींद में () unistd.h में
रिचर्ड हैरिसन

1
@TommasoTheaCioni ठीक है, मुझे लगता है कि आप का मतलब है, "मैं कैसे देरी पर बिल्कुल पुनः आरंभ करने के लिए कार्यक्रम प्राप्त कर सकता हूं ?", और जवाब है ... आप नहीं कर सकते। आप ऑपरेटिंग सिस्टम को उस डिग्री तक नियंत्रित नहीं करते हैं। यदि कुछ अन्य कार्यक्रम कुछ महत्वपूर्ण खंड के बीच में हैं, तो आपके कार्यक्रम को बस इंतजार करना होगा।
बिलजमदेव

136

C ++ 11 के लिए एक अद्यतन उत्तर:

sleep_forऔर sleep_untilकार्यों का उपयोग करें :

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread; // sleep_for, sleep_until
    using namespace std::chrono; // nanoseconds, system_clock, seconds

    sleep_for(nanoseconds(10));
    sleep_until(system_clock::now() + seconds(1));
}

इन कार्यों के साथ वहाँ नहीं रह गया है एक की जरूरत लगातार बेहतर समाधान के लिए नए कार्यों को जोड़ने में है: sleep, usleep, nanosleep, आदि sleep_forऔर sleep_untilटेम्पलेट कार्यों कि माध्यम से किसी भी संकल्प के मूल्यों को स्वीकार कर सकते हैं chronoप्रकार; घंटे, सेकंड, फेमटोसेकंड, आदि।

C ++ में 14 आप आगे के लिए शाब्दिक प्रत्यय के साथ कोड को आसान बनाने में कर सकते हैं nanosecondsऔर seconds:

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;

    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);
}

ध्यान दें कि एक नींद की वास्तविक अवधि कार्यान्वयन पर निर्भर करती है: आप 10 नैनोसेकंड के लिए सोने के लिए कह सकते हैं, लेकिन एक कार्यान्वयन इसके बजाय एक मिलीसेकंड के लिए नींद खत्म हो सकता है, अगर यह सबसे कम हो सकता है।


4
उपयोगकर्ता परिभाषित शाब्दिक प्रत्यय। उन्होंने खोदा ... बहुत गहरा।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

33
#include <unistd.h>
usleep(3000000);

यह भी तीन सेकंड के लिए सो जाएगा। आप संख्याओं को थोड़ा और परिष्कृत कर सकते हैं।


धन्यवाद! सरल और साफ समाधान। जी ++ वीएस कोड के साथ मैक संकलन पर काम किया।
Z41N

17

क्या आप कुछ सरल जैसा चाहते हैं

sleep(3);

यह होना चाहिए। यह लगभग सार्वभौमिक है। आपने इसे किस भाषा / संकलक में आज़माया? क्या आपने सभी आवश्यक पुस्तकालयों का आयात किया था?
जेजे

3
मैं समझ नहीं पा रहा था कि इसे उत्तर के रूप में क्यों नहीं चिह्नित किया गया या बहुत अधिक
उत्थान

8

ध्यान दें कि यह गारंटी नहीं देता है कि थ्रेड की नींद की अवधि नींद की अवधि के करीब कहीं भी होगी, यह केवल गारंटी देता है कि थ्रेड को जारी रखने से पहले समय की मात्रा कम से कम वांछित राशि होगी। वास्तविक देरी परिस्थितियों के आधार पर अलग-अलग होगी (विशेष रूप से मशीन पर सवाल में लोड) और वांछित नींद के समय से अधिक परिमाण के आदेश हो सकते हैं।

इसके अलावा, आप सूचीबद्ध नहीं करते हैं कि आपको सोने की आवश्यकता क्यों है लेकिन आपको आमतौर पर सिंक्रनाइज़ेशन की एक विधि के रूप में देरी का उपयोग करने से बचना चाहिए।


4

आप इस कोड स्निपेट को आज़मा सकते हैं:

#include<chrono>
#include<thread>

int main(){
    std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));
}

3

यदि आप माइक्रोसेकंड प्रिसेंस चाहते हैं, तो आप चुनिंदा (2) का भी उपयोग कर सकते हैं (यह प्लेटफॉर्म पर काम करता है, जिसमें व्हिप नहीं है (3))

निम्नलिखित कोड 1.5 सेकंड के लिए इंतजार करेगा:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() {
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);
}

`


3

हाँ, नींद शायद यहाँ पसंद का कार्य है। ध्यान दें कि फ़ंक्शन में दिया गया समय उस समय की सबसे छोटी मात्रा है जब कॉलिंग थ्रेड निष्क्रिय होगा। उदाहरण के लिए यदि आप 5 सेकंड के साथ सोते हैं, तो आपको गारंटी है कि आपका धागा कम से कम 5 सेकंड के लिए सो जाएगा। ओएस क्या कर रहा है, इसके आधार पर 6 या 8 या 50 हो सकता है। (इष्टतम OS निष्पादन के दौरान, यह 5 के बहुत करीब होगा।)
स्लीप फंक्शन की एक और उपयोगी विशेषता 0. पास करना है। यह आपके थ्रेड से एक संदर्भ स्विच को मजबूर करेगा।

कुछ अतिरिक्त जानकारी:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html


3

मैंने पाया कि "_sleep(milliseconds);"(उद्धरण चिह्नों के बिना) Win32 के लिए अच्छी तरह से काम करता है यदि आप chronoपुस्तकालय शामिल करते हैं

उदाहरण के लिए:

#include <chrono>

using namespace std;

main
{
    cout << "text" << endl;
    _sleep(10000); // pauses for 10 seconds
}

सुनिश्चित करें कि आप सोने से पहले अंडरस्कोर शामिल करें।


इस फ़ंक्शन को नए पुस्तकालय या ऑपरेटिंग सिस्टम की कार्यक्षमता द्वारा सुपरसीड किया गया है। इसके बजाय नींद का उपयोग करने पर विचार करें।
byWaleed

3

निश्चित समय के लिए cpp में आउटपुट में देरी करने के लिए, आप स्लीप () फ़ंक्शन का उपयोग कर सकते हैं। windows (h) के लिए हेडर फाइल सिंटैक्स स्लीप () फ़ंक्शन स्लीप (time_in_ms) के रूप में शामिल है

cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";

आउटपुट। उपरोक्त कोड Apple को प्रिंट करेगा और मैंगो को छापने से पहले 3 सेकंड तक प्रतीक्षा करेगा।


2

यहाँ शीर्ष उत्तर OS आश्रित उत्तर लगता है; एक अधिक पोर्टेबल समाधान के लिए आप एक त्वरित नींद फ़ंक्शन लिख सकते हैं, जो कि समय सीमा शीर्षलेख फ़ाइल का उपयोग करके किया जा सकता है (हालांकि यह मेरी ओर से खराब कार्यान्वयन हो सकता है)।

#include <iostream>
#include <ctime>

using namespace std;

void sleep(float seconds){
    clock_t startClock = clock();
    float secondsAhead = seconds * CLOCKS_PER_SEC;
    // do nothing until the elapsed time has passed.
    while(clock() < startClock+secondsAhead);
    return;
}
int main(){

    cout << "Next string coming up in one second!" << endl;
    sleep(1.0);
    cout << "Hey, what did I miss?" << endl;

    return 0;
}

0

वाक्य - विन्यास:

शून्य नींद (अहस्ताक्षरित सेकंड);

नींद () एक अंतराल (सेकंड) के लिए निष्पादन को निलंबित करती है। सोने के लिए कॉल के साथ, वर्तमान कार्यक्रम को तर्क सेकंड द्वारा निर्दिष्ट सेकंड की संख्या के लिए निष्पादन से निलंबित कर दिया जाता है। अंतराल केवल एक सेकंड के निकटतम सौवें या ऑपरेटिंग सिस्टम घड़ी की सटीकता के लिए सटीक है, जो भी कम सटीक है।


0

कई अन्य लोगों ने सोने के लिए अच्छी जानकारी दी है। मैं वेज से सहमत हूं कि एक नींद सबसे उपयुक्त समाधान है।

यदि आप किसी चीज का इंतजार करते हुए सो रहे हैं, तो आप वास्तव में उस चीज / घटना की प्रतीक्षा कर रहे हैं। इसके लिए कंडीशन वेरिएबल्स देखें।

मुझे नहीं पता कि आप किस ओएस पर ऐसा करने की कोशिश कर रहे हैं, लेकिन थ्रेडिंग और सिंक्रोनाइज़ेशन के लिए आप बूस्ट थ्रेडिंग लाइब्रेरी ( Boost Condition Varriable ) को देख सकते हैं।

अब दूसरे चरम पर जा रहे हैं यदि आप असाधारण रूप से छोटी अवधि के लिए प्रतीक्षा करने की कोशिश कर रहे हैं तो हैक शैली विकल्पों के एक जोड़े हैं। यदि आप किसी प्रकार के एम्बेडेड प्लेटफ़ॉर्म पर काम कर रहे हैं, जहां 'नींद' लागू नहीं होती है, तो आप एक खाली शरीर के साथ एक साधारण लूप (/ / जबकि आदि) की कोशिश कर सकते हैं (सावधान रहें कि कंपाइलर इसे अनुकूलित नहीं करता है)। बेशक इंतजार का समय इस मामले में विशिष्ट हार्डवेयर पर निर्भर है। वास्तव में छोटे 'इंतजार' के लिए आप असेंबली "एनओपी" की कोशिश कर सकते हैं। मुझे अत्यधिक संदेह है कि आप क्या कर रहे हैं, लेकिन यह जानने के बिना कि आपको प्रतीक्षा करने की आवश्यकता क्यों है और अधिक विशिष्ट होना मुश्किल है।


0

विंडोज पर आप विंडोज़ लाइब्रेरी शामिल कर सकते हैं और "स्लीप (0);" कार्यक्रम को सोने के लिए। यह एक मान लेता है जो मिलीसेकंड का प्रतिनिधित्व करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.