मिलीसेकंड के लिए नींद


630

मुझे पता है कि POSIX sleep(x)फ़ंक्शन x सेकंड के लिए प्रोग्राम को सोता है। क्या C ++ में x मिलीसेकंड के लिए प्रोग्राम को सोने के लिए एक फ़ंक्शन है ?


7
आपको पता होना चाहिए कि, विंडोज में वैसे भी Sleep()मिलीसेकंड सटीक है , लेकिन यह सटीकता अधिक परिमाण के आदेश हो सकते हैं। आप सोच सकते हैं कि आपकी नींद 4 मिलीसेकंड की है, लेकिन वास्तव में 400 की नींद आती है।
जॉन डिब्लिंग

5
@ जॉन डिब्लिंग: मुझे लगता है कि वह पोसिक्स का इस्तेमाल कर रहा है sleep, न कि विन 32 Sleepको "एक्स सेकंड्स" दिया।
सीबी बेली

1
यद्यपि C और C ++ में अलग-अलग नाम की मेनिंग है, जो बग और असंगति का स्रोत हो सकती है, ज्यादातर मामलों में C ++ में C हेडर का उपयोग करना ठीक है। हालांकि, यदि आप पूरी तरह से सुनिश्चित होना चाहते हैं कि कुछ भी गलत नहीं होता है, #includeतो सी extern "C" {}ब्लॉक के अंदर हैडर । साथ ही, यदि आपके पास C और C ++ स्रोत फ़ाइलें एक ही प्रोजेक्ट में हैं, तो यह अत्यधिक अनुशंसा की जाती है कि आप किसी भी समस्या से बचने के लिए ऐसा करें, खासकर यदि आप दोनों प्रकार की स्रोत फ़ाइलों में एक ही हेडर शामिल करते हैं (जिस स्थिति में यह आवश्यक है) । यदि आपके पास शुद्ध रूप से C ++ प्रोजेक्ट है, तो यह बिना किसी समस्या के बस काम कर सकता है।
adam10603

2
@ जॉनडब्लिंग नं, 400ms नहीं। आपके द्वारा अब तक प्राप्त की गई सबसे खराब परिशुद्धता विंडोज 9x से थी, जिसका GetTickCount55ms रिज़ॉल्यूशन था; बाद के संस्करणों में 16ms रिज़ॉल्यूशन या उससे कम था। एक उपयोगकर्ता ने सोचा कि वह नींद से 16ms संकल्प प्राप्त कर रहा है, लेकिन फिर रिपोर्ट की गई कि वह Sleepस्वयं काफी सटीक था, और GetTickCountसमय बीतने को मापने के लिए उपयोग करने से स्पष्ट खराबी पैदा हुई थी ।
क्वर्टी

जवाबों:


457

ध्यान दें कि मिलीसेकंड के लिए कोई मानक C API नहीं है, इसलिए (यूनिक्स पर) आपको usleepमाइक्रोसेकंड स्वीकार करना होगा:

#include <unistd.h>

unsigned int microseconds;
...
usleep(microseconds);

2
क्या यह एक व्यस्त नींद है? मुझे नींद के दौरान एक और धागे की उपज की आवश्यकता है; क्या मैं उसके लिए उपयोग कर सकता हूं usleep?
माइकल

13
यह एक व्यस्त प्रतीक्षा stackoverflow.com/a/8156644/1206499 नहीं है , और अप्रचलित होने के nanosleepबाद से बेहतर विकल्प हो सकता usleepहै।
जस्वेटजेन

4
नीट, कृपया @ HighCommander4 के उत्तर का उल्लेख करें जो कि C ++ 11 संकलक होने पर अधिक पोर्टेबल है।
15

6
usleep () 2001 में POSIX में पदावनत और 2008 में हटा दिया गया।
जेट्स्की एस-टाइप

1270

C ++ 11 में, आप मानक पुस्तकालय सुविधाओं के साथ ऐसा कर सकते हैं:

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));

स्पष्ट और पठनीय, कोई और अनुमान लगाने की आवश्यकता नहीं है कि sleep()फ़ंक्शन क्या इकाइयाँ लेता है।


6
क्या std :: this_thread :: sleep_for एक रुकावट बिंदु को परिभाषित करता है? बूस्ट की तरह :: this_thread_sleep करता है?
मार्टिन मीसर

73
यह इसे करने का सही तरीका है। अवधि। थ्रेड क्रॉस प्लेटफॉर्म के साथ-साथ क्रोनो भी है।
शून्य

88
@Void। निश्चित रूप से एक बहुत अच्छा तरीका है, लेकिन "द" और "अवधि" भयानक रूप से मजबूत शब्द हैं।
Mad Physicist

5
क्या यह एक व्यस्त नींद है? मुझे नींद के दौरान एक और धागे की उपज चाहिए; क्या मैं उसके लिए उपयोग कर सकता हूं sleep_for?
माइकल

14
@ मिचेल: यह एक व्यस्त नींद नहीं है, यह अन्य धागों को जन्म देगा।
HighCommander4

83

पोर्टेबल रहने के लिए आप बूस्ट का उपयोग कर सकते हैं :: सोने के लिए धागा :

#include <boost/thread/thread.hpp>

int main()
{
    //waits 2 seconds
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );

    return 0;
}

यह उत्तर एक डुप्लिकेट है और पहले इस प्रश्न में पोस्ट किया गया है । शायद आपको वहाँ कुछ उपयोगी उत्तर भी मिल सकते हैं।


6
ध्यान रखें कि - एक बहु-थ्रेडेड वातावरण में - boost::this_thread::sleepआपके कोड में एक रुकावट बिंदु जोड़ता है। boost.org/doc/libs/1_49_0/doc/html/thread/…
मार्टिन मीसर

35

यूनिक्स में आप usleep का उपयोग कर सकते हैं ।

विंडोज में नींद है


4
और विंडोज कॉल मिलीसेकंड में है।
14

17
आपको क्रमशः <unistd.h> या <Windows.h> को शामिल करना होगा।
gbmhunter

हां, लेकिन वास्तविक समय संकल्प 15-16 एमएस नहीं हो सकता है (भले ही कॉल में यूनिट 1 एमएस हो) और इस तरह न्यूनतम समय 15-16 एमएस हो सकता है?
पीटर मॉर्टेंसन

33

आपके प्लेटफ़ॉर्म के आधार पर आपके पास उपलब्ध usleepया nanosleepउपलब्ध हो सकता है । usleepहटा दिया गया है और सबसे हाल ही में POSIX मानक से हटा दिया गया है; nanosleepपसंद है।


6
ध्यान दें कि जबकि usleep()घोषित किया गया है <unistd.h>, भ्रामक रूप nanosleep()से <time.h>/ में घोषित किया गया है <ctime>
gbmhunter

27

क्यों नहीं। Time.h पुस्तकालय का उपयोग करें? Windows और POSIX सिस्टम पर चलता है:

#include <iostream>
#include <time.h>

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    clock_t time_end;
    time_end = clock() + milliseconds * CLOCKS_PER_SEC/1000;
    while (clock() < time_end)
    {
    }
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

सही कोड - अब CPU IDLE स्थिति में रहता है [2014.05.24]:

#include <iostream>
#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif // _WIN32

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    #ifdef _WIN32
        Sleep(milliseconds);
    #else
        usleep(milliseconds * 1000);
    #endif // _WIN32
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

24
उस कोड के साथ समस्याओं में से एक यह है कि यह एक व्यस्त लूप है, यह एकल प्रोसेसर कोर के 100% का उपयोग करना जारी रखेगा। स्लीप फ़ंक्शन को एक OS कॉल के चारों ओर लागू किया जाता है जो वर्तमान थ्रेड को सोने और कुछ और करने के लिए डाल देगा, और केवल थ्रेड को जगाएगा जब निर्दिष्ट समय समाप्त हो जाएगा।
इस्माइल

आप सही कह रहे हैं - यह एक सीपीयू कोर के 100% का उपभोग करेगा। इसलिए यहाँ सिस्टम स्लीप फ़ंक्शंस का उपयोग करके फिर से कोड लिखा गया है - और यह अभी भी क्रॉस-प्लेटफ़ॉर्म है:
बार्ट ग्रेज़ीबी

@BartGrzybicki मुझे पता है कि यह एक पुराना उत्तर है और सभी, लेकिन एक विंडोज़ मशीन पर विजुअल स्टूडियो 2017 में, #ifdef WIN32सही-डिफ़ॉल्ट के रूप में मूल्यांकन नहीं करता है।
kayleeFrye_onDeck

2
@kayleeFrye_onDeck कोड गलत है। यह होना चाहिए #ifdef _WIN32
कंटैंगो

1
@Contango मुझे पता था कि! लेकिन तब नहीं जब मैंने लिखा कि ... लोल। पालन ​​करने के लिए धन्यवाद!
kayleeFrye_onDeck

17

nanosleepसे बेहतर विकल्प है usleep- यह इंटरप्ट के खिलाफ अधिक लचीला है।


6
मैं परिचित था usleep, लेकिन नहीं nanosleep। आपको लिनक्स पर इसका उपयोग करने का एक उदाहरण प्रदान करना चाहिए।
jww

14
#include <windows.h>

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

Sleep (  __in DWORD dwMilliseconds   );

उपयोग:

Sleep (1000); //Sleeps for 1000 ms or 1 sec

3
इसके लिए आपको क्या शामिल करने की आवश्यकता है?
25ol'z o qoq

#include <WinBase.h>
फोबार

7
नहीं, आपको चाहिए#include <windows.h>
needolʇz q qoq

7
प्रश्न दृढ़ता से यह बताता है कि POSIX समाधान की आवश्यकता है।
टोबे स्पाइट

7

यदि MS Visual C ++ 10.0 का उपयोग कर रहे हैं, तो आप इसे मानक लाइब्रेरी सुविधाओं के साथ कर सकते हैं:

Concurrency::wait(milliseconds);

आपको चाहिये होगा:

#include <concrt.h>

10
"मानक" शब्द का उपयोग न करें जब आप वास्तव में इसका मतलब नहीं करते हैं। <concrt.h>है एक मानक पुस्तकालय हैडर - यह एक मंच पुस्तकालय हो सकता है; जिस स्थिति में आपको आवश्यक शर्तें स्पष्ट रूप से बतानी चाहिए।
टोबे स्पाइट

5

selectफ़ंक्शन (POSIX, Linux, और Windows) के साथ प्लेटफार्मों पर आप कर सकते हैं:

void sleep(unsigned long msec) {
    timeval delay = {msec / 1000, msec % 1000 * 1000};
    int rc = ::select(0, NULL, NULL, NULL, &delay);
    if(-1 == rc) {
        // Handle signals by continuing to sleep or return immediately.
    }
}

हालाँकि, आजकल बेहतर विकल्प उपलब्ध हैं।


Windows मशीन पर VS2017 में संकलन नहीं कर सकते:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck

@kayleeFrye_onDeck यह संकलन करता है। बस लिंक नहीं है लुकअप आप विंडोज डॉक्स।
मैक्सिम एगोरुस्किन

आप किस टाइमलाइन के लिए हेडर का उपयोग करते हैं ??
टोटे कार्लसन


4

C ++ में आपके प्रोग्राम को सोने का Sleep(int)तरीका है। इसके लिए हैडर फ़ाइल है#include "windows.h."

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

#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;

int main()
{
    int x = 6000;
    Sleep(x);
    cout << "6 seconds have passed" << endl;
    return 0;
}

यह जिस समय सोता है वह मिलीसेकंड में मापा जाता है और इसकी कोई सीमा नहीं होती है।

Second = 1000 milliseconds
Minute = 60000 milliseconds
Hour = 3600000 milliseconds

3
आपका क्या मतलब है इसकी कोई सीमा नहीं है? यह निश्चित रूप से सीमा है जो 0xFFFFFFFE है। 0xFFFFFFFF की प्रतीक्षा में अभी समय नहीं लगेगा (इसका अर्थ है कि यह कार्यक्रम समाप्त होने तक प्रतीक्षा करेगा)।
इज़ी

मेरा मतलब यह नहीं था कि इज़ी, हमारी गलतफहमी के लिए क्षमा करें। मेरा मतलब था कि आप किसी भी सकारात्मक संख्या में मिलीसेकंड दर्ज कर सकते हैं। इसलिए यह इंतजार करना होगा कि कई मिलिसेकंड प्रोग्राम को बंद कर दें। अगर आपको समझ में नहीं आ रहा है तो कृपया कहें, मैं आपको और समझाऊंगा।
फि

हां, लेकिन यह वास्तविक समय संकल्प क्या है? क्या यह कुछ मामलों में 15-16 एमएस नहीं हो सकता है? उदाहरण के लिए, यदि आप स्लीप (3) का उपयोग करते हैं तो क्या यह वास्तव में 3 एमएस के लिए सोएगा या इसके बजाय 15-16 एमएस होगा?
पीटर मोर्टेंसन

3

सेलेक्ट कॉल अधिक सटीक होने का एक तरीका है (नींद का समय नैनोसेकंड में निर्दिष्ट किया जा सकता है)।


हालांकि यह समस्या को हल करने के लिए एक मूल्यवान संकेत हो सकता है, एक अच्छा जवाब भी समाधान को प्रदर्शित करता है। कृपया संपादित तुम क्या मतलब है दिखाने के लिए उदाहरण कोड प्रदान करने के लिए। वैकल्पिक रूप से, इसके बजाय टिप्पणी के रूप में लिखने पर विचार करें।
टोबे स्पाइट

3

बूस्ट एसिंक्रोनस इनपुट / आउटपुट थ्रेड्स का उपयोग करें, एक्स मिलीसेकंड के लिए सो जाओ;

#include <boost/thread.hpp>
#include <boost/asio.hpp>

boost::thread::sleep(boost::get_system_time() + boost::posix_time::millisec(1000));

यदि आप 3 मिलीसेकेंड सोने की कोशिश करेंगे तो वास्तव में क्या होगा? क्या इसकी जगह 15-16 मिलीसेकंड हो जाएंगे? क्या आपने इसे मापा है?
पीटर मोर्टेंसन

1

सवाल पुराना है, लेकिन मैंने अपने ऐप में ऐसा करने के लिए एक सरल तरीका निकालने में कामयाब रहा। आप इसे उपयोग करने के लिए नीचे दिखाए अनुसार C / C ++ मैक्रो बना सकते हैं:

#ifndef MACROS_H
#define MACROS_H

#include <unistd.h>

#define msleep(X) usleep(X * 1000)

#endif // MACROS_H


0

POSIX सिस्टम के लिए Win32 प्रतिस्थापन के रूप में:

void Sleep(unsigned int milliseconds) {
    usleep(milliseconds * 1000);
}

while (1) {
    printf(".");
    Sleep((unsigned int)(1000.0f/20.0f)); // 20 fps
}

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