আপনি কীভাবে একটি সি ++ প্রোগ্রামে সময়সীমা বিলম্ব যুক্ত করবেন?


94

আমি একটি সি ++ প্রোগ্রামে সময়োপযোগী দেরি যুক্ত করার চেষ্টা করছি এবং আমি ভাবছিলাম যে আমি কী চেষ্টা করতে পারি বা তথ্য যেটি দেখতে পারি সে সম্পর্কে কারও কোনও পরামর্শ আছে কিনা?

আমি আশা করি কীভাবে আমি এই সময়োপযোগী বিলম্ব বাস্তবায়িত করছি সে সম্পর্কে আমার আরও বিশদ ছিল তবে আমি কীভাবে একটি সময়সীমা বিলম্ব যুক্ত করব তার আরও তথ্য না পাওয়া পর্যন্ত আমি কীভাবে এটি বাস্তবায়ন করার চেষ্টা করব সে সম্পর্কেও আমি নিশ্চিত নই।


4
এটি নির্ভর করে কোন প্ল্যাটফর্ম (ওএস) এবং আপনার কোন লাইব্রেরি উপলব্ধ।
স্কট ল্যাংহাম 16

উত্তর:


79

উইন 32: Sleep(milliseconds)আপনি কি

ইউনিক্স: usleep(microseconds)আপনি যা চান

ঘুম () কেবল বেশ কয়েক সেকেন্ড সময় নেয় যা প্রায়শই দীর্ঘ হয়।


4
ন্যানোস্লিপও রয়েছে () যদি আমাদের ঘুম () আপনাকে পর্যাপ্ত রেজোলিউশন দেয় না।
ক্রিস্টোফার জনসন

9
মনে রাখবেন যে এই ফাংশনগুলির যুক্তিটি ন্যূনতম ঘুমের সময়, এবং গ্যারান্টি দিবেন না যে যদি অন্য কোনও প্রক্রিয়া সেই সময় সিপিইউতে হগিং করে থাকে তবে আপনি এখনই ফিরে আসবেন।
বিলজামেদেব

4
@ রিচার্ড হ্যারিসন: ঘুমানোর () কাজ করতে আমাকে কোন শিরোনামটি অন্তর্ভুক্ত করতে হবে?
24:37

12
উইন32 স্লিপ-এ @ ওভারফ্লো উইন্ডোজে রয়েছে; ইউনিক্স ঘুমে () unistd.h এ
রিচার্ড হ্যারিসন

4
@TommasoTheaCioni ঠিক আছে, আমি অনুমান আপনি কি বলতে চান, "আমি প্রোগ্রাম পুনরায় আরম্ভ কিভাবে যাব ঠিক বিলম্ব এ?", ও উত্তর তুমি পারবে না ... হয়। আপনি সেই ডিগ্রীতে অপারেটিং সিস্টেমটি নিয়ন্ত্রণ করেন না। যদি কিছু অন্যান্য প্রোগ্রাম কিছু সমালোচনামূলক বিভাগের মাঝামাঝি হয় তবে আপনার প্রোগ্রামটি কেবল অপেক্ষা করতে হবে।
বিলজমেশদেব

138

সি ++ 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ধরনের; ঘন্টা, সেকেন্ড, ফেমটোসেকেন্ডস ইত্যাদি

সি ++ 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
ব্যবহারকারী সংজ্ঞায়িত আক্ষরিক প্রত্যয়। তারা খনন করেছে ... খুব গভীর।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

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

এটিও তিন সেকেন্ডের জন্য ঘুমাবে। আপনি কিছুটা হলেও সংশোধন করতে পারেন।


ধন্যবাদ! সহজ এবং পরিষ্কার সমাধান। জি ++ ভিএস কোড সহ ম্যাক সংকলনে কাজ করেছেন।
জেড 41 এন 22

18

আপনি কি মত সাধারণ কিছু চান?

sleep(3);

এটা করা উচিত। এটি প্রায় সর্বজনীন। আপনি কোন ভাষায় / কম্পাইলারটি ব্যবহার করে দেখেছেন? আপনি প্রয়োজনীয় সমস্ত লাইব্রেরি আমদানি করেছেন?
জেজে

4
কেন এটি উত্তর হিসাবে চিহ্নিত করা হয়নি বা খুব বেশি
উত্সাহিত

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

আপনি যদি মাইক্রোসেকেন্ডের নির্ভুলতা চান (তবে এটি প্ল্যাটফর্মটিতে কাজ করে যা আমাদের ঘুমায় না (3)) ব্যবহার করে আপনি নির্বাচন (2 )ও ব্যবহার করতে পারেন

নিম্নলিখিত কোডটি 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 হতে পারে। (অনুকূল ওএস কার্যকরকরণের সময়, এটি 5 এর খুব কাছাকাছি থাকবে
the) ঘুমের ক্রিয়াকলাপের আর একটি দরকারী বৈশিষ্ট্যটি 0 এ পাস করা This এটি আপনার থ্রেড থেকে প্রসঙ্গের সুইচকে বাধ্য করবে।

কিছু অতিরিক্ত তথ্য:
http://www.opengroup.org/onlinepubs/000095399/function/sleep.html


3

আমি খুঁজে পেয়েছি যে "_sleep(milliseconds);"(উদ্ধৃতি ব্যতীত) উইন 32 এর জন্য ভাল কাজ করে যদি আপনি chronoগ্রন্থাগারটি অন্তর্ভুক্ত করেন

যেমন:

#include <chrono>

using namespace std;

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

আপনি ঘুমের আগে আন্ডারস্কোরটি অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন।


এই ফাংশনটি নতুন লাইব্রেরি বা অপারেটিং সিস্টেমের কার্যকারিতা দ্বারা চালিত হয়েছে। পরিবর্তে ঘুম ব্যবহার বিবেচনা করুন।
বাইওয়ালিদ

3

নির্ধারিত সময়ের জন্য সিপিতে আউটপুট বিলম্ব করতে আপনি উইন্ডোজ। শিরোনাম ফাইলের সিনট্যাক্সের জন্য উইন্ডোজ শিরোনাম () দ্বারা স্লিপ () ফাংশনটি স্লিপ (টাইম_ইন_এমএস) হিসাবে ব্যবহার করতে পারেন

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

আউটপুট উপরের কোডটি অ্যাপল প্রিন্ট করবে এবং আমের মুদ্রণের আগে 3 সেকেন্ড অপেক্ষা করবে।


2

এখানে শীর্ষ উত্তরটি একটি ওএস নির্ভর উত্তর বলে মনে হচ্ছে; আরও পোর্টেবল সমাধানের জন্য আপনি সিটিটাইম হেডার ফাইলটি ব্যবহার করে দ্রুত স্লিপ ফাংশন লিখতে পারেন (যদিও এটি আমার পক্ষে একটি খারাপ প্রয়োগ হতে পারে)।

#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

আরও অনেকে ঘুমানোর জন্য ভাল তথ্য সরবরাহ করেছেন। আমি শোথের সাথে একমত যে একটি ঘুম খুব কমই উপযুক্ত সমাধান।

আপনি যদি কোনও কিছুর জন্য অপেক্ষা করে ঘুমিয়ে থাকেন, তবে আপনি সেই জিনিস / ইভেন্টের জন্য অপেক্ষা করা থেকে ভাল। এর জন্য কন্ডিশনের ভেরিয়েবলগুলি দেখুন।

আপনি কী ওএস এ চেষ্টা করে যাচ্ছেন তা আমি জানি না, তবে থ্রেডিং এবং সিঙ্ক্রোনাইজেশনের জন্য আপনি বুস্ট থ্রেডিং লাইব্রেরিগুলিতে ( বুস্ট কন্ডিশন ভেরিয়েবল ) দেখতে পারেন।

এখন অন্য চূড়ান্ত দিকে সরানো যদি আপনি ব্যতিক্রমী সংক্ষিপ্ত সময়ের জন্য অপেক্ষা করার চেষ্টা করছেন তবে সেখানে বেশ কয়েকটি হ্যাক শৈলীর বিকল্প রয়েছে। আপনি যদি এম্বেডেড প্ল্যাটফর্মের কোনও ধরণের যেখানে কর্মরত থাকেন যেখানে 'ঘুম' বাস্তবায়িত হয় না তবে আপনি খালি শরীর নিয়ে একটি সাধারণ লুপ (যখন / কখন ইত্যাদি) চেষ্টা করতে পারেন (সাবধানে সংকলকটি এটি অপ্টিমাইজ করে না)। অবশ্যই অপেক্ষা করার সময়টি এই ক্ষেত্রে নির্দিষ্ট হার্ডওয়্যারের উপর নির্ভর করে। সত্যিই সংক্ষিপ্ত 'অপেক্ষার' জন্য আপনি একটি সমাবেশ "নাপ" চেষ্টা করতে পারেন। আপনার পরে কী তা আমি খুব সন্দেহ করি কিন্তু কেন আপনাকে অপেক্ষা করা দরকার তা আরও নির্দিষ্ট করে জানার দরকার ছাড়াই।


0

উইন্ডোজে আপনি উইন্ডোজ লাইব্রেরি অন্তর্ভুক্ত করতে পারেন এবং "ঘুম (0)" ব্যবহার করতে পারেন; প্রোগ্রাম ঘুমাতে। এটি এমন একটি মান নেয় যা মিলিসেকেন্ডগুলিকে উপস্থাপন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.