Bagaimana Anda menambahkan penundaan waktu ke program C ++?

94

Saya mencoba menambahkan penundaan waktu dalam program C ++, dan bertanya-tanya apakah ada yang punya saran tentang apa yang dapat saya coba atau informasi yang dapat saya lihat?

Saya berharap saya memiliki lebih banyak detail tentang bagaimana saya menerapkan penundaan berjangka waktu ini, tetapi sampai saya memiliki informasi lebih lanjut tentang cara menambahkan penundaan berwaktu, saya tidak yakin tentang bagaimana saya harus mencoba menerapkan ini.

Matt Pascoe
sumber
2
Itu tergantung platform (OS) apa dan perpustakaan apa yang Anda miliki.
Scott Langham

Jawaban:

79

Win32: Sleep(milliseconds)adalah apa yang Anda

unix: usleep(microseconds)adalah yang Anda inginkan.

sleep () hanya membutuhkan beberapa detik yang seringkali terlalu lama.

Richard Harrison
sumber
3
Ada juga nanosleep () jika usleep () tidak memberi Anda resolusi yang cukup.
Kristopher Johnson
9
Perlu diingat bahwa argumen untuk fungsi-fungsi ini adalah waktu tidur MINIMUM, dan JANGAN menjamin Anda akan segera kembali jika proses lain memonopoli CPU pada saat itu.
billjamesdev
1
@ Richard Harrison: Header mana yang harus saya sertakan agar sleep () berfungsi?
Overflowh
12
@Overflowh di win32 Tidur () ada di windows.h; pada unix sleep () di unistd.h
Richard Harrison
1
@TommasoTheaCioni Oke, saya anggap maksud Anda, "Bagaimana saya bisa membuat program untuk memulai ulang tepat pada saat penundaan?", Dan jawabannya adalah ... Anda tidak bisa. Anda tidak mengontrol sistem operasi sejauh itu. Jika program lain berada di tengah-tengah segmen kritis, program Anda hanya perlu menunggu.
billjamesdev
138

Jawaban terbaru untuk C ++ 11:

Gunakan sleep_fordan sleep_untilfungsi:

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

Dengan fungsi ini tidak ada lagi kebutuhan untuk terus menambahkan fungsi baru untuk resolusi yang lebih baik: sleep, usleep, nanosleep, dllsleep_for dan sleep_untilmerupakan fungsi template yang dapat menerima nilai-nilai dari setiap resolusi melalui chronojenis; jam, detik, femtoseconds, dll.

Di C ++ 14 Anda dapat lebih menyederhanakan kode dengan sufiks literal untuk nanosecondsdan 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);
}

Perhatikan bahwa durasi aktual tidur bergantung pada penerapannya: Anda dapat meminta tidur selama 10 nanodetik, tetapi penerapan mungkin akan berakhir dalam mode tidur selama satu milidetik, jika itu yang terpendek yang dapat dilakukan.

bames53
sumber
4
Sufiks literal yang ditentukan pengguna. Mereka menggali ... terlalu dalam.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
34
#include <unistd.h>
usleep(3000000);

Ini juga akan tidur selama tiga detik. Anda bisa memperbaiki angkanya sedikit lagi.

Samir Talwar
sumber
Terima kasih! Solusi sederhana dan bersih. Bekerja pada kompilasi Mac dengan G ++ VS Code.
Z41N
18

Apakah Anda menginginkan sesuatu yang sederhana seperti

sleep(3);
JJ
sumber
Itu harus. Ini hampir universal. Bahasa / Kompiler apa yang Anda coba? Apakah Anda mengimpor semua perpustakaan yang diperlukan?
JJ
4
Saya tidak mengerti mengapa itu tidak ditandai sebagai jawaban atau tidak banyak dipilih
ImranNaqvi
8

Perhatikan bahwa ini tidak menjamin bahwa jumlah waktu thread tidur akan mendekati periode tidur, ini hanya menjamin bahwa jumlah waktu sebelum thread melanjutkan eksekusi akan setidaknya jumlah yang diinginkan. Penundaan sebenarnya akan bervariasi tergantung pada keadaan (terutama beban pada mesin yang bersangkutan) dan mungkin lipat lebih tinggi dari waktu tidur yang diinginkan.

Selain itu, Anda tidak mencantumkan mengapa Anda perlu tidur tetapi Anda biasanya harus menghindari penggunaan penundaan sebagai metode sinkronisasi.

Baji
sumber
4

Anda dapat mencoba cuplikan kode ini:

#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));
}
Jayesh Rathod
sumber
3

Anda juga dapat menggunakan pilih (2) jika Anda menginginkan presisi mikrodetik (ini berfungsi pada platform yang tidak memiliki mode tidur (3))

Kode berikut akan menunggu selama 1,5 detik:

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

`

Mathias Brossard
sumber
3

Ya, tidur mungkin merupakan fungsi pilihan di sini. Perhatikan bahwa waktu yang dilewati ke fungsi adalah jumlah waktu terkecil thread pemanggil tidak aktif. Jadi misalnya jika Anda menyebut tidur dengan 5 detik, Anda dijamin utas Anda akan tidur setidaknya selama 5 detik. Bisa 6, atau 8 atau 50, tergantung pada apa yang dilakukan OS. (Selama eksekusi OS yang optimal, ini akan sangat mendekati 5.)
Fitur lain yang berguna dari fungsi tidur adalah memasukkan 0. Ini akan memaksa sakelar konteks dari utas Anda.

Beberapa informasi tambahan:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

Marcin
sumber
3

Saya menemukan bahwa "_sleep(milliseconds);"(tanpa tanda kutip) berfungsi dengan baik untuk Win32 jika Anda menyertakan filechrono perpustakaan

Misalnya:

#include <chrono>

using namespace std;

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

Pastikan Anda memasukkan garis bawah sebelum tidur.

ARoberts
sumber
Fungsi ini telah digantikan oleh pustaka atau fungsi sistem operasi yang lebih baru. Pertimbangkan untuk menggunakan Sleep sebagai gantinya.
ByWaleed
3

untuk menunda output di cpp untuk waktu tetap, Anda dapat menggunakan fungsi Sleep () dengan memasukkan sintaks file header windows.h untuk fungsi Sleep () adalah Sleep (time_in_ms) sebagai

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

KELUARAN. kode di atas akan mencetak Apple dan menunggu selama 3 detik sebelum mencetak Mango.

Abhishek Rathore
sumber
2

Jawaban teratas di sini tampaknya merupakan jawaban yang bergantung pada OS; untuk solusi yang lebih portabel Anda dapat menulis fungsi tidur cepat menggunakan file header ctime (meskipun ini mungkin implementasi yang buruk di pihak saya).

#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;
}
Milan Donhowe
sumber
0

Sintaksis:

batal tidur (detik tak bertanda tangan);

sleep () menangguhkan eksekusi untuk suatu interval (detik). Dengan panggilan untuk tidur, program saat ini ditangguhkan dari eksekusi selama jumlah detik yang ditentukan oleh argumen detik. Interval hanya akurat hingga seperseratus detik terdekat atau keakuratan jam sistem operasi, mana saja yang kurang akurat.

GEOCHET
sumber
0

Banyak orang lain telah memberikan info yang baik untuk tidur. Saya setuju dengan Wedge bahwa tidur jarang menjadi solusi yang paling tepat.

Jika Anda tidur sambil menunggu sesuatu, maka lebih baik Anda benar-benar menunggu hal / peristiwa itu. Lihat Variabel Kondisi untuk ini.

Saya tidak tahu OS apa yang Anda coba lakukan ini, tetapi untuk threading dan sinkronisasi Anda dapat melihat ke pustaka Boost Threading ( Boost Condition Varriable ).

Pindah sekarang ke ekstrem lain jika Anda mencoba menunggu dalam waktu yang sangat singkat maka ada beberapa opsi gaya peretasan. Jika Anda bekerja pada semacam platform tertanam di mana 'tidur' tidak diterapkan maka Anda dapat mencoba loop sederhana (untuk / sementara dll) dengan badan kosong (hati-hati kompiler tidak mengoptimalkannya). Tentu saja waktu tunggu tergantung pada perangkat keras tertentu dalam kasus ini. Untuk 'menunggu' yang sangat singkat, Anda dapat mencoba perakitan "nop". Saya sangat meragukan ini yang Anda cari, tetapi tanpa mengetahui mengapa Anda harus menunggu, sulit untuk lebih spesifik.


sumber
0

Di Windows, Anda dapat menyertakan pustaka windows dan menggunakan "Sleep (0);" untuk menghentikan program. Dibutuhkan nilai yang mewakili milidetik.

Zee JollyRoger
sumber