Anda harus menyadari bahwa, di Windows, Sleep()memiliki ketepatan milidetik , tetapi akurasinya bisa lebih tinggi. Anda mungkin berpikir tidur Anda selama 4 milidetik, tetapi sebenarnya tidur selama 400.
John Dibling
5
@ John Dibling: Saya pikir dia menggunakan POSIX sleep, bukan win32 Sleepdiberi "x detik".
CB Bailey
1
Meskipun C dan C ++ memiliki nama mangling yang berbeda, yang dapat menjadi sumber bug dan ketidakcocokan, dalam kebanyakan kasus tidak masalah menggunakan header C di C ++. Namun, jika Anda ingin benar-benar yakin bahwa tidak ada yang salah, #includeheader C di dalam extern "C" {}blok. Juga, jika Anda memiliki file sumber C dan C ++ dalam proyek yang sama, sangat disarankan agar Anda melakukan ini untuk menghindari masalah, terutama jika Anda menyertakan header yang sama di kedua jenis file sumber (dalam hal ini diperlukan) . Jika Anda memiliki proyek C ++ murni, mungkin hanya bekerja tanpa masalah sama sekali.
adam10603
2
@ JohnDibling no, bukan 400ms. Ketepatan terburuk yang mungkin Anda dapatkan adalah dari Windows 9x, yang GetTickCountmemiliki resolusi 55ms; versi selanjutnya memiliki resolusi 16ms atau kurang. Seorang pengguna mengira ia mendapatkan resolusi 16ms dari Sleep tetapi kemudian melaporkan bahwa Sleepitu sendiri cukup akurat, dan ketidaktepatan yang disebabkan oleh penggunaan GetTickCountuntuk mengukur berlalunya waktu.
Qwertie
Jawaban:
457
Perhatikan bahwa tidak ada API C standar untuk milidetik, jadi (pada Unix) Anda harus puas usleep, yang menerima mikrodetik:
Jawaban ini adalah duplikat dan telah diposting dalam pertanyaan ini sebelumnya. Mungkin Anda bisa menemukan beberapa jawaban yang dapat digunakan di sana juga.
Anda harus memasukkan masing-masing <unistd.h> atau <Windows.h>.
gbmhunter
Ya, tetapi tidak bisakah resolusi waktu aktual menjadi 15-16 ms (bahkan jika unit dalam panggilan adalah 1 ms) dan dengan demikian waktu minimum adalah 15-16 ms?
Peter Mortensen
33
Tergantung pada platform Anda, Anda mungkin memiliki usleepatau nanosleeptersedia. usleepsudah usang dan telah dihapus dari standar POSIX terbaru; nanosleeplebih disukai.
Salah satu masalah dengan kode itu adalah bahwa itu adalah loop sibuk, akan terus menggunakan 100% dari inti prosesor tunggal. Fungsi sleep diimplementasikan di sekitar panggilan OS yang akan mengaktifkan thread saat ini dan melakukan sesuatu yang lain, dan hanya akan membangunkan thread ketika waktu yang ditentukan berakhir.
Ismael
Anda benar - itu akan mengkonsumsi 100% dari satu inti CPU. Jadi di sini adalah kode yang ditulis ulang menggunakan fungsi sistem tidur - dan itu masih lintas platform:
Bart Grzybicki
@ BartGrzybicki saya tahu ini adalah jawaban lama dan semuanya, tetapi dalam Visual Studio 2017 di mesin windows, #ifdef WIN32tidak mengevaluasi sebagai benar secara default.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck Code salah. Seharusnya begitu #ifdef _WIN32.
Contango
1
@Contango Saya tahu itu! Tetapi tidak ketika saya menulis itu ... lol. Terima kasih atas tindak lanjutnya!
kayleeFrye_onDeck
17
nanosleepadalah pilihan yang lebih baik daripada usleep- lebih tahan terhadap interupsi.
Jangan menggunakan kata "standar" ketika Anda tidak benar-benar bersungguh-sungguh. <concrt.h>adalah tidak header Standard Library - mungkin perpustakaan platform yang; dalam hal ini Anda harus menyatakan prasyarat dengan jelas.
Toby Speight
5
Pada platform dengan selectfungsi (POSIX, Linux, dan Windows) yang dapat Anda lakukan:
void sleep(unsignedlong 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.}}
Namun, ada alternatif yang lebih baik tersedia saat ini.
Tampaknya tidak dapat mengkompilasi dalam VS2017 pada mesin Windows:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck Itu mengkompilasi. Hanya saja tidak terhubung. Cari Windows docs Anda.
Maxim Egorushkin
header apa yang Anda gunakan untuk jangka waktu ??
Totte Karlsson
@TotteKarlsson <sys/time.h>.
Maxim Egorushkin
4
Cara untuk tidur program Anda di C ++ adalah Sleep(int)metode. File header untuk itu adalah#include "windows.h."
Sebagai contoh:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
Waktu tidur diukur dalam milidetik dan tidak memiliki batas.
Apa maksudmu tidak ada batasan? Itu pasti memiliki batas yaitu 0xFFFFFFFE. Menunggu 0xFFFFFFFF tidak akan habis (artinya akan menunggu sampai program berakhir).
Izzy
Aku tidak bermaksud seperti itu, Izzy, maaf atas kesalahpahaman kita. Maksud saya, Anda dapat memasukkan jumlah milidetik positif. Jadi itu akan menunggu banyak milidetik untuk menutup program. Jika Anda tidak mengerti, tolong katakan demikian, saya akan menjelaskan lebih banyak kepada Anda.
Phi
Ya, tapi apa itu resolusi waktu yang sebenarnya? Mungkinkah itu 15-16 ms dalam beberapa kasus? Misalnya, jika Anda menggunakan Sleep (3) apakah akan benar-benar tidur selama 3 ms atau malah 15-16 ms?
Peter Mortensen
3
Pilih panggilan adalah cara untuk memiliki lebih presisi (waktu tidur dapat ditentukan dalam nanodetik).
Meskipun ini mungkin merupakan petunjuk yang berharga untuk menyelesaikan masalah, jawaban yang baik juga menunjukkan solusinya. Harap edit untuk memberikan kode contoh untuk menunjukkan maksud Anda. Sebagai alternatif, pertimbangkan menulis ini sebagai komentar.
Toby Speight
3
Gunakan Boost input / output thread asynchronous, sleep selama x milidetik;
Apa yang sebenarnya akan terjadi jika Anda mencoba tidur selama 3 milidetik? Apakah itu akan menjadi 15-16 milidetik saja? Sudahkah Anda mengukurnya?
Peter Mortensen
1
Pertanyaannya sudah lama, tetapi saya berhasil menemukan cara sederhana untuk memiliki ini di aplikasi saya. Anda dapat membuat makro C / C ++ seperti yang ditunjukkan di bawah ini menggunakannya:
Sleep()
memiliki ketepatan milidetik , tetapi akurasinya bisa lebih tinggi. Anda mungkin berpikir tidur Anda selama 4 milidetik, tetapi sebenarnya tidur selama 400.sleep
, bukan win32Sleep
diberi "x detik".#include
header C di dalamextern "C" {}
blok. Juga, jika Anda memiliki file sumber C dan C ++ dalam proyek yang sama, sangat disarankan agar Anda melakukan ini untuk menghindari masalah, terutama jika Anda menyertakan header yang sama di kedua jenis file sumber (dalam hal ini diperlukan) . Jika Anda memiliki proyek C ++ murni, mungkin hanya bekerja tanpa masalah sama sekali.GetTickCount
memiliki resolusi 55ms; versi selanjutnya memiliki resolusi 16ms atau kurang. Seorang pengguna mengira ia mendapatkan resolusi 16ms dari Sleep tetapi kemudian melaporkan bahwaSleep
itu sendiri cukup akurat, dan ketidaktepatan yang disebabkan oleh penggunaanGetTickCount
untuk mengukur berlalunya waktu.Jawaban:
Perhatikan bahwa tidak ada API C standar untuk milidetik, jadi (pada Unix) Anda harus puas
usleep
, yang menerima mikrodetik:sumber
usleep
untuk itunanosleep
mungkin merupakan pilihan yang lebih baik karenausleep
sudah usang.Di C ++ 11, Anda dapat melakukan ini dengan fasilitas perpustakaan standar:
Jelas dan mudah dibaca, tidak perlu lagi menebak unit apa yang
sleep()
dibutuhkan fungsi.sumber
sleep_for
untuk ituUntuk tetap portabel Anda bisa menggunakan Boost :: Thread untuk tidur:
Jawaban ini adalah duplikat dan telah diposting dalam pertanyaan ini sebelumnya. Mungkin Anda bisa menemukan beberapa jawaban yang dapat digunakan di sana juga.
sumber
boost::this_thread::sleep
menambahkan titik interupsi ke kode Anda. boost.org/doc/libs/1_49_0/doc/html/thread/…Di Unix Anda bisa menggunakan usleep .
Di Windows ada Sleep .
sumber
Tergantung pada platform Anda, Anda mungkin memiliki
usleep
ataunanosleep
tersedia.usleep
sudah usang dan telah dihapus dari standar POSIX terbaru;nanosleep
lebih disukai.sumber
usleep()
dideklarasikan dalam<unistd.h>
, secara membingungkan,nanosleep()
dinyatakan dalam<time.h>
/<ctime>
.Mengapa tidak menggunakan perpustakaan time.h? Berjalan pada sistem Windows dan POSIX:
Kode yang diperbaiki - sekarang CPU tetap dalam status IDLE [2014.05.24]:
sumber
#ifdef WIN32
tidak mengevaluasi sebagai benar secara default.#ifdef _WIN32
.nanosleep
adalah pilihan yang lebih baik daripadausleep
- lebih tahan terhadap interupsi.sumber
usleep
, tetapi tidaknanosleep
. Anda harus memberikan contoh menggunakannya di Linux.Sintaksis:
Pemakaian:
sumber
#include <WinBase.h>
#include <windows.h>
Jika menggunakan MS Visual C ++ 10.0, Anda dapat melakukan ini dengan fasilitas perpustakaan standar:
Anda akan perlu:
sumber
<concrt.h>
adalah tidak header Standard Library - mungkin perpustakaan platform yang; dalam hal ini Anda harus menyatakan prasyarat dengan jelas.Pada platform dengan
select
fungsi (POSIX, Linux, dan Windows) yang dapat Anda lakukan:Namun, ada alternatif yang lebih baik tersedia saat ini.
sumber
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.Cara untuk tidur program Anda di C ++ adalah
Sleep(int)
metode. File header untuk itu adalah#include "windows.h."
Sebagai contoh:
Waktu tidur diukur dalam milidetik dan tidak memiliki batas.
sumber
Pilih panggilan adalah cara untuk memiliki lebih presisi (waktu tidur dapat ditentukan dalam nanodetik).
sumber
Gunakan Boost input / output thread asynchronous, sleep selama x milidetik;
sumber
Pertanyaannya sudah lama, tetapi saya berhasil menemukan cara sederhana untuk memiliki ini di aplikasi saya. Anda dapat membuat makro C / C ++ seperti yang ditunjukkan di bawah ini menggunakannya:
sumber
Dari C ++ 14 menggunakan std dan juga literal numeriknya:
sumber
Sebagai pengganti Win32 untuk sistem POSIX:
sumber
nanosleep()
untukusleep()
: yang terakhir sudah ditinggalkan dan telah dihapus dari yang paling standar POSIX baru-baru ini.