মিলিসেকেন্ডের জন্য ঘুমান


630

আমি জানি পসিক্স sleep(x)ফাংশনটি X সেকেন্ডের জন্য প্রোগ্রামটিকে ঘুমায়। সি ++ তে এক্স মিলিসেকেন্ডের জন্য প্রোগ্রামটি ঘুমানোর জন্য কোনও ফাংশন রয়েছে কি ?


7
আপনার সচেতন হওয়া উচিত যে উইন্ডোজে যাইহোক, Sleep()মিলিসেকেন্ড যথার্থতা রয়েছে , তবে এটি যথার্থতা উচ্চতর আকারের আদেশ হতে পারে। আপনি আপনার ঘুমন্ত 4 মিলিসেকেন্ডের জন্য ভাবতে পারেন তবে বাস্তবে 400
জনের

5
@ জন ডিবলিং: আমি মনে করি তিনি পসিক্স ব্যবহার করছেন sleep, উইন 32 Sleep"এক্স সেকেন্ড" না দিয়েই ব্যবহার করছেন ।
সিবি বেইলি

1
যদিও সি এবং সি ++ এর আলাদা নাম ম্যাংলিং রয়েছে, যা বাগ এবং অসঙ্গতিগুলির উত্স হতে পারে, বেশিরভাগ ক্ষেত্রে সি ++ এ সি শিরোনাম ব্যবহার করা ভাল। যাইহোক, আপনি যদি নিশ্চিত হন যে কোনও কিছু ভুল না হয় সে বিষয়ে নিশ্চিত হতে চান, #includeকোনও extern "C" {}ব্লকের ভিতরে সি শিরোনাম । এছাড়াও, যদি একই প্রকল্পে আপনার সি এবং সি ++ উত্স ফাইল থাকে তবে কোনও সমস্যা এড়াতে আপনি এটি করার জন্য অত্যন্ত সুপারিশ করা হয়েছে, বিশেষত যদি আপনি উভয় ধরণের উত্স ফাইলগুলিতে একই শিরোনাম অন্তর্ভুক্ত করেন (তবে এই ক্ষেত্রে এটি প্রয়োজনীয়) । আপনার যদি খাঁটি সি ++ প্রকল্প থাকে তবে এটি কোনও সমস্যা ছাড়াই কেবল কাজ করবে।
adam10603

2
@ জনডিবলিং নং, 400 মিমি না আপনি যে সবচেয়ে খারাপ স্পষ্টতা অর্জন করতে পারেন GetTickCountতা হ'ল উইন্ডোজ 9 এক্স, যার 55 মিমি রেজোলিউশন ছিল; পরবর্তী সংস্করণগুলিতে 16 মাইল রেজোলিউশন বা তারও কম ছিল। একজন ব্যবহারকারী ভেবেছিলেন যে তিনি ঘুম থেকে 16 মাইল রেজোলিউশন পাচ্ছেন তবে তারপরে জানিয়েছিলেন যে Sleepনিজেই মোটামুটি সঠিক, এবং সময় অতিক্রমের GetTickCountপরিমাপের জন্য এই আপত্তিহীন ত্রুটি ঘটেছে
কিওয়ারটি

উত্তর:


457

নোট করুন যে মিলিসেকেন্ডগুলির জন্য কোনও স্ট্যান্ডার্ড সি এপিআই নেই, সুতরাং (ইউনিক্সে) আপনাকে মীমাংসা করতে হবে usleep, যা মাইক্রোসেকেন্ডগুলি গ্রহণ করে:

#include <unistd.h>

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

2
এটা কি ব্যস্ত ঘুম? ঘুমের সময় আমার অন্য থ্রেডে উঠতে হবে; আমি কি এর usleepজন্য ব্যবহার করতে পারি ?
মাইকেল 18 ই

13
এটি কোনও ব্যস্ত অপেক্ষা নয় স্ট্যাকওভারফ্লো.com/ a/ 8156644 / 1206499 , এবং অপ্রচলিত হওয়ায় এটিnanosleep আরও ভাল পছন্দ হতে পারে usleep
jswetzen

4
নীট, দয়া করে @ হাইকম্যান্ডার 4 এর উত্তর উল্লেখ করে বিবেচনা করুন যা আপনার কাছে সি ++ 11 সংকলক থাকলে আরও বহনযোগ্য।
einpoklum

6
ইউএসলিপ () 2001 এ পসিক্স-এ অবনতি হয়েছে এবং ২০০ 2008 সালে সরানো হয়েছে
জেটস্কি এস-টাইপ

1269

সি ++ 11 এ আপনি স্ট্যান্ডার্ড লাইব্রেরি সুবিধা সহ এটি করতে পারেন:

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

পরিষ্কার এবং পঠনযোগ্য, sleep()ফাংশনটি কী ইউনিট নেয় তা অনুমান করার দরকার নেই ।


6
এসটিডি :: এই_প্রেম :: ঘুম_এমন একটি বাধা বিন্দু সংজ্ঞায়িত করে? বুস্টের মতো :: এই_প্রেম_ ঘুম কি?
মার্টিন মিজার

73
এটি করার সঠিক উপায় এটি। সময়কাল। থ্রেড ক্রোন প্ল্যাটফর্মের পাশাপাশি ক্রোনো।
অকার্যকর

88
@Void। অবশ্যই খুব ভাল উপায়, তবে "" এবং "পিরিয়ড" ভয়ঙ্কর শক্ত শব্দ।
ম্যাড পদার্থবিদ

5
এটা কি ব্যস্ত ঘুম? ঘুমের সময় আমার অন্য থ্রেডে উঠতে হবে; আমি কি এর sleep_forজন্য ব্যবহার করতে পারি ?
মাইকেল 18 ই

14
@ মিশেল: এটি কোনও ব্যস্ত ঘুম নয়, এটি অন্যান্য থ্রেডে উত্পন্ন করবে।
হাইকম্যান্ডার 4

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

ইউনিক্সে আপনি আমাদের ঘুম ব্যবহার করতে পারেন ।

উইন্ডোজ রয়েছে ঘুম


4
এবং উইন্ডোজ কলটি মিলি সেকেন্ডে রয়েছে।
shindigo

17
আপনাকে যথাক্রমে <unistd.h> বা <উইন্ডোজ h> অন্তর্ভুক্ত করতে হবে।
gbmhunter

হ্যাঁ, তবে প্রকৃত সময়ের রেজোলিউশনটি 15-16 এমএস হতে পারে না (এমনকি কলটিতে ইউনিটটি 1 এমএস হয়) এবং এভাবে সর্বনিম্ন সময় 15-15 এমএস হতে পারে?
পিটার মর্টেনসেন

33

আপনার প্ল্যাটফর্মের উপর নির্ভর করে আপনার থাকতে পারে usleepবা nanosleepউপলব্ধ। usleepঅবহিত করা হয়েছে এবং অতি সাম্প্রতিক পসিক্স মান থেকে মুছে ফেলা হয়েছে; nanosleepপছন্দসই


6
নোট যে usleep()ঘোষণা করা হয় <unistd.h>, confusingly, nanosleep()ঘোষণা করা হয় <time.h>/ <ctime>
gbmhunter

27

কেন টাইম। H লাইব্রেরি ব্যবহার করবেন না? উইন্ডোজ এবং পসিক্স সিস্টেমে চলছে:

#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;
}

সংশোধিত কোড - এখন সিপিইউ আইডিএল অবস্থায় থাকে [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% ব্যবহার অবিরত করবে। ঘুমের ফাংশনটি একটি ওএস কলের চারপাশে বাস্তবায়িত হয় যা বর্তমান থ্রেডটি ঘুমিয়ে দেবে এবং অন্য কিছু করবে এবং নির্দিষ্ট সময়সীমা শেষ হওয়ার পরে কেবল থ্রেড জাগবে।
ইসমাইল

আপনি ঠিক বলেছেন - এটি একটি সিপিইউ কোরের 100% গ্রাস করবে। সুতরাং এখানে সিস্টেম স্লিপ ফাংশনগুলি ব্যবহার করে কোডটি পুনরায়
লিখে দেওয়া হয়েছে

@ বার্টগ্রিজিবিকি আমি জানি এটি একটি পুরানো উত্তর এবং সমস্ত, তবে উইন্ডোজ মেশিনে ভিজ্যুয়াল স্টুডিও 2017-এ, #ifdef WIN32সত্য-সত্যই মূল্যায়ন করে না।
kayleeFrye_onDeck

2
@ কেলেলিফ্রি_অনডেক কোডটি ভুল। এটা হওয়া উচিত #ifdef _WIN32
কনটাঙ্গো

1
@ কনটাঙ্গো আমি জানতাম! কিন্তু আমি যখন এটি লিখেছি না ... হুম। ফলোআপের জন্য ধন্যবাদ!
kayleeFrye_onDeck

17

nanosleepএর চেয়ে ভাল পছন্দ usleep- এটি বাধাগুলির বিরুদ্ধে আরও স্থিতিস্থাপক।


6
আমি পরিচিত ছিল usleep, কিন্তু না nanosleep। এটি লিনাক্সে ব্যবহারের একটি উদাহরণ দেওয়া উচিত।
jw.org

14
#include <windows.h>

বাক্য গঠন:

Sleep (  __in DWORD dwMilliseconds   );

ব্যবহার:

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

3
এর জন্য আপনাকে কী অন্তর্ভুক্ত করতে হবে?
ɐǝolɐǝz ǝɥʇ qoq

#include <WinBase.h>
foobar

7
না, আপনার দরকার#include <windows.h>
26olɐǝz ǝɥʇ qoq

7
প্রশ্নটি দৃ strongly়ভাবে বোঝায় যে একটি পসিক্স সমাধান প্রয়োজন।
টবি স্পিড 9

7

যদি এমএস ভিজ্যুয়াল সি ++ 10.0 ব্যবহার করে থাকেন তবে আপনি স্ট্যান্ডার্ড লাইব্রেরি সুবিধা সহ এটি করতে পারেন:

Concurrency::wait(milliseconds);

আপনার প্রয়োজন হবে:

#include <concrt.h>

10
"স্ট্যান্ডার্ড" শব্দটি ব্যবহার করবেন না যখন আপনি আসলে এটি বোঝায় না। <concrt.h>হয় না একটি স্ট্যান্ডার্ড লাইব্রেরী হেডার - এটা একটি প্ল্যাটফর্ম গ্রন্থাগার হতে পারে; এক্ষেত্রে আপনার পূর্বশর্তগুলি পরিষ্কারভাবে উল্লেখ করা উচিত।
টবি স্পিড 9

5

প্ল্যাটফর্মগুলিতে selectফাংশন (POSIX, লিনাক্স এবং উইন্ডোজ) সহ আপনি করতে পারেন:

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

তবে আজকাল আরও ভাল বিকল্প পাওয়া যায়।


উইন্ডোজ মেশিনে ভিএস ২০১7-এ সংকলন করার মতো বলে মনে হচ্ছে না:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
কায়লিফ্রি_অনডেক

@ কেলেলিফ্রি_অনডেক এটি সংকলন করে। শুধু লিঙ্ক দেয় না। আপনি উইন্ডোজ ডক্স অনুসন্ধান।
ম্যাক্সিম এগারুশকিন

4

আপনার প্রোগ্রামটি সি ++ এ ঘুমানোর উপায়টি হ'ল 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। 0xFFFFFFFFF এর জন্য অপেক্ষা করা ঠিক সময় শেষ করবে না (যার অর্থ এটি প্রোগ্রাম শেষ হওয়া পর্যন্ত অপেক্ষা করবে)।
ইজজি

আমি এটিকে ইজির মতো বোঝাতে চাইনি, আমাদের ভুল বোঝাবুঝির জন্য দুঃখিত। আমি বোঝাতে চাইছিলাম যে আপনি যেকোন ধনাত্মক সংখ্যক মিলিসেকেন্ডে প্রবেশ করতে পারেন। সুতরাং এটি অনেক মিলিসেকেন্ডের জন্য প্রোগ্রামটি বন্ধ করতে অপেক্ষা করবে। আপনি যদি না বুঝতে পারেন তবে দয়া করে বলুন, আমি আপনাকে আরও ব্যাখ্যা করব।
ফি

হ্যাঁ, তবে এটি আসল সময়ের রেজোলিউশন কী? এটি কিছু ক্ষেত্রে 15-16 এমএস হতে পারে না? উদাহরণস্বরূপ, আপনি যদি ঘুম (3) ব্যবহার করেন তবে এটি কি আসলে 3 এমএসের জন্য ঘুমাবে বা পরিবর্তে এটি 15-16 এমএস হবে?
পিটার মর্টেনসেন

3

কলটি নির্বাচন করা আরও নির্ভুলতার একটি উপায় (ঘুমের সময়টি ন্যানোসেকেন্ডগুলিতে নির্দিষ্ট করা যেতে পারে)।


সমস্যাটি সমাধান করার জন্য এটি মূল্যবান ইঙ্গিত হতে পারে, তবে একটি উত্তরের উত্তরও সমাধানটি প্রদর্শন করে। আপনার অর্থটি বোঝাতে উদাহরণ কোড সরবরাহ করতে দয়া করে সম্পাদনা করুন । বিকল্পভাবে, পরিবর্তে মন্তব্য হিসাবে এটি লেখার বিবেচনা করুন।
টবি স্পিড 9

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

প্রশ্নটি পুরানো, তবে আমি আমার অ্যাপ্লিকেশনটিতে এটি রাখার একটি সহজ উপায় বের করতে সক্ষম হয়েছি। আপনি নীচে প্রদর্শিত হবে হিসাবে একটি সি / সি ++ ম্যাক্রো তৈরি করতে পারেন এটি ব্যবহার করুন:

#ifndef MACROS_H
#define MACROS_H

#include <unistd.h>

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

#endif // MACROS_H

1

সি ++ 14 থেকে এসডিডি এবং এর সংখ্যাসূচক অক্ষর ব্যবহার করে:

#include <chrono>
#include <thread>

using namespace std::chrono;

std::this_thread::sleep_for(123ms);

0

পসিক্স সিস্টেমগুলির জন্য উইন 32 প্রতিস্থাপন হিসাবে:

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

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

এটিকে পছন্দ nanosleep()করুন usleep(): আধুনিকটি অবচয় করা হয়েছে এবং অতি সাম্প্রতিক পসিক্স মান থেকে মুছে ফেলা হয়েছে।
টবি স্পিড 9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.