Você deve estar ciente de que, no Windows, de qualquer maneira, Sleep()tem precisão de milissegundos , mas sua precisão pode ser de magnitude superior. Você pode pensar que o seu sono para 4 milissegundos, mas na verdade dormir por 400.
John Dibling
5
@ John Dibling: Eu acho que ele está usando POSIX sleep, não win32, Sleepdado "x segundos".
CB Bailey
1
Embora C e C ++ tenham nomes diferentes, que podem ser uma fonte de bugs e incompatibilidades, na maioria dos casos é bom usar cabeçalhos C em C ++. No entanto, se você quiser ter certeza absoluta de que nada der errado, #includeo cabeçalho C dentro de um extern "C" {}bloco. Além disso, se você tiver arquivos de origem C e C ++ no mesmo projeto, é altamente recomendável fazer isso para evitar problemas, especialmente se você incluir os mesmos cabeçalhos nos dois tipos de arquivos de origem (nesse caso, isso é necessário) . Se você possui um projeto puramente em C ++, ele pode funcionar sem problemas.
adam10603
2
@JohnDibling não, não 400ms. A pior precisão que você pode ter obtido foi no Windows 9x, cuja GetTickCountresolução era de 55ms; versões posteriores tinham resolução de 16ms ou menos. Um usuário pensou que estava obtendo uma resolução de 16ms do Sleep, mas depois relatou que Sleepera bastante preciso, e a aparente imprecisão foi causada pelo uso GetTickCountpara medir a passagem do tempo.
Qwertie
Respostas:
457
Observe que não há API C padrão por milissegundos, então (no Unix) você terá que se contentar com usleep, que aceita microssegundos:
Você deve incluir <unistd.h> ou <Windows.h> respectivamente.
Gbmhunter
Sim, mas a resolução de tempo real não pode ser de 15 a 16 ms (mesmo que a unidade na chamada seja de 1 ms) e, portanto, o tempo mínimo seja de 15 a 16 ms?
Peter Mortensen
33
Dependendo da sua plataforma, você pode ter usleepou estar nanosleepdisponível. usleepfoi descontinuado e foi excluído do padrão POSIX mais recente; nanosleepé preferível.
Um dos problemas desse código é que ele é um loop ocupado, ele continuará usando 100% de um único núcleo de processador. A função de suspensão é implementada em torno de uma chamada do sistema operacional que colocará em suspensão o encadeamento atual e fará outra coisa e só ativará o encadeamento quando o tempo especificado expirar.
Ismael
Você está certo - ele consumirá 100% de um núcleo de uma CPU. Então aqui é reescrito usando funções do sono sistema - e ainda é multi-plataforma:
Bart Grzybicki
@BartGrzybicki eu sei que esta é uma resposta antiga e tudo, mas no Visual Studio 2017 em uma máquina Windows, #ifdef WIN32não é avaliada como verdadeira por padrão.
kayleeFrye_onDeck
2
@kayleeFrye_onDeck O código está errado. Deveria ser #ifdef _WIN32.
Contango 22/08/19
1
@ Contango eu sabia disso! Mas não quando eu escrevi isso ... lol. Obrigado pelo seguimento!
precisa saber é o seguinte
17
nanosleepé uma escolha melhor do que usleep- é mais resistente a interrupções.
Não use a palavra "padrão" quando não estiver falando sério. não<concrt.h> é um cabeçalho da biblioteca padrão - pode ser uma biblioteca de plataforma; nesse caso, você deve indicar claramente os pré-requisitos.
21417 Toby Speight
5
Em plataformas com a selectfunção (POSIX, Linux e Windows), você pode:
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.}}
No entanto, existem melhores alternativas disponíveis atualmente.
Parece que não consigo compilar no VS2017 em uma máquina Windows:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck Compila. Apenas não vincula. Pesquise seus documentos do Windows.
Maxim Egorushkin
qual cabeçalho você usa para timeval ??
Totte Karlsson
@TotteKarlsson <sys/time.h>.
Maxim Egorushkin
4
A maneira de adormecer seu programa em C ++ é o Sleep(int)método O arquivo de cabeçalho para ele é#include "windows.h."
Por exemplo:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
O tempo em que dorme é medido em milissegundos e não tem limite.
Como assim, não tem limite? Certamente tem um limite que é 0xFFFFFFFE. A espera de 0xFFFFFFFF simplesmente não atingirá o tempo limite (o que significa que esperará até o programa terminar).
Izzy
Eu não quis dizer isso assim Izzy, desculpe pelo nosso mal-entendido. Eu quis dizer que você pode inserir qualquer número positivo de milissegundos. Portanto, esperará muitos milissegundos para fechar o programa. Se você não entender, diga-o, explicarei mais.
Phi
Sim, mas qual é a resolução de tempo real? Não poderia ser 15-16 ms em alguns casos? Por exemplo, se você usar o Sleep (3), ele dormirá por 3 ms ou 15-16 ms?
Peter Mortensen
3
A chamada de seleção é uma maneira de ter mais precisão (o tempo de suspensão pode ser especificado em nanossegundos).
Embora isso possa ser uma dica valiosa para resolver o problema, uma boa resposta também demonstra a solução. Por favor edite a fornecer exemplo de código para mostrar o que você quer dizer. Como alternativa, considere escrever isso como um comentário.
precisa
3
Use os threads de entrada / saída assíncronos Boost, durma por x milissegundos;
O que realmente acontecerá se você tentar dormir por 3 milissegundos? Serão 15-16 milissegundos? Você mediu isso?
Peter Mortensen
1
A pergunta é antiga, mas consegui descobrir uma maneira simples de fazer isso no meu aplicativo. Você pode criar uma macro C / C ++, como mostrado abaixo, para usá-la:
Sleep()
tem precisão de milissegundos , mas sua precisão pode ser de magnitude superior. Você pode pensar que o seu sono para 4 milissegundos, mas na verdade dormir por 400.sleep
, não win32,Sleep
dado "x segundos".#include
o cabeçalho C dentro de umextern "C" {}
bloco. Além disso, se você tiver arquivos de origem C e C ++ no mesmo projeto, é altamente recomendável fazer isso para evitar problemas, especialmente se você incluir os mesmos cabeçalhos nos dois tipos de arquivos de origem (nesse caso, isso é necessário) . Se você possui um projeto puramente em C ++, ele pode funcionar sem problemas.GetTickCount
resolução era de 55ms; versões posteriores tinham resolução de 16ms ou menos. Um usuário pensou que estava obtendo uma resolução de 16ms do Sleep, mas depois relatou queSleep
era bastante preciso, e a aparente imprecisão foi causada pelo usoGetTickCount
para medir a passagem do tempo.Respostas:
Observe que não há API C padrão por milissegundos, então (no Unix) você terá que se contentar com
usleep
, que aceita microssegundos:fonte
usleep
para isso?nanosleep
pode ser uma escolha melhor, poisusleep
está obsoleta.No C ++ 11, você pode fazer isso com os recursos padrão da biblioteca:
Clara e legível, não há mais necessidade de adivinhar quais unidades a
sleep()
função leva.fonte
sleep_for
para isso?Para permanecer portátil, você pode usar o Boost :: Thread para dormir:
Esta resposta é uma duplicata e foi postada nesta pergunta antes. Talvez você possa encontrar algumas respostas úteis também.
fonte
boost::this_thread::sleep
adiciona um ponto de interrupção ao seu código. boost.org/doc/libs/1_49_0/doc/html/thread/…No Unix, você pode usar usleep .
No Windows, há suspensão .
fonte
Dependendo da sua plataforma, você pode ter
usleep
ou estarnanosleep
disponível.usleep
foi descontinuado e foi excluído do padrão POSIX mais recente;nanosleep
é preferível.fonte
usleep()
é declarado em<unistd.h>
, confusamente,nanosleep()
é declarado em<time.h>
/<ctime>
.Por que não usar a biblioteca time.h? Executa nos sistemas Windows e POSIX:
Código corrigido - agora a CPU permanece no estado IDLE [2014.05.24]:
fonte
#ifdef WIN32
não é avaliada como verdadeira por padrão.#ifdef _WIN32
.nanosleep
é uma escolha melhor do queusleep
- é mais resistente a interrupções.fonte
usleep
, mas nãonanosleep
. Você deve fornecer um exemplo de uso no Linux.Sintaxe:
Uso:
fonte
#include <WinBase.h>
#include <windows.h>
Se você estiver usando o MS Visual C ++ 10.0, poderá fazer isso com os recursos padrão da biblioteca:
você vai precisar de:
fonte
<concrt.h>
é um cabeçalho da biblioteca padrão - pode ser uma biblioteca de plataforma; nesse caso, você deve indicar claramente os pré-requisitos.Em plataformas com a
select
função (POSIX, Linux e Windows), você pode:No entanto, existem melhores alternativas disponíveis atualmente.
fonte
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.A maneira de adormecer seu programa em C ++ é o
Sleep(int)
método O arquivo de cabeçalho para ele é#include "windows.h."
Por exemplo:
O tempo em que dorme é medido em milissegundos e não tem limite.
fonte
A chamada de seleção é uma maneira de ter mais precisão (o tempo de suspensão pode ser especificado em nanossegundos).
fonte
Use os threads de entrada / saída assíncronos Boost, durma por x milissegundos;
fonte
A pergunta é antiga, mas consegui descobrir uma maneira simples de fazer isso no meu aplicativo. Você pode criar uma macro C / C ++, como mostrado abaixo, para usá-la:
fonte
Do C ++ 14 usando std e também seus literais numéricos:
fonte
Como um substituto do Win32 para sistemas POSIX:
fonte
nanosleep()
ausleep()
: este último é obsoleto e foi excluído do padrão POSIX mais recente.