Bir C ++ programına nasıl zaman gecikmesi eklersiniz?


94

Bir C ++ programına zamanlanmış bir gecikme eklemeye çalışıyorum ve deneyebileceğim veya bakabileceğim bilgiler hakkında herhangi birinin önerisi olup olmadığını merak ediyordum.

Keşke bu zamanlanmış gecikmeyi nasıl uyguladığımla ilgili daha fazla ayrıntıya sahip olsaydım, ancak zamanlanmış bir gecikmenin nasıl ekleneceği konusunda daha fazla bilgiye sahip olana kadar, bunu nasıl uygulamaya çalışacağımdan bile emin değilim.


2
Hangi platforma (OS) ve hangi kitaplıklara sahip olduğunuza bağlıdır.
Scott Langham

Yanıtlar:


79

Win32: Sleep(milliseconds)sen ne yapıyorsun

unix: usleep(microseconds)istediğiniz şeydir.

sleep () yalnızca birkaç saniye sürer ve bu genellikle çok uzundur.


3
Usleep () size yeterli çözünürlük sağlamazsa nanosleep () de vardır.
Kristopher Johnson

9
Unutmayın ki, bu işlevlere ilişkin argümanın MİNİMUM uyku süreleri olduğunu ve o sırada CPU'yu başka bir işlem çalıştırıyorsa hemen geri döneceğinizi garanti etmeyin.
billjamesdev

1
@Richard Harrison: Sleep () çalışmasına izin vermek için hangi başlığı eklemem gerekiyor?
Overflowh

12
Win32 üzerinde @Overflowh Sleep () windows.h içindedir; unistd.h içinde unix sleep () üzerinde
Richard Harrison

1
@TommasoTheaCioni Tamam, "Ben yeniden program alabilirsiniz Nasıl mı demek farz tam olarak ? Gecikmeyle", cevap yapamazsın ... olduğunu. İşletim sistemini o derece kontrol etmiyorsunuz. Kritik bir bölümün ortasında başka bir program varsa, programınızın beklemesi gerekir.
billjamesdev

138

C ++ 11 için güncellenmiş bir cevap:

sleep_forVe sleep_untilişlevlerini kullanın :

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

Bu işlevleri ile sürekli daha iyi çözünürlük için yeni fonksiyonlar eklemek için bir ihtiyaç artık yok: sleep, usleep, nanosleepvb sleep_forve sleep_untilüzerinden herhangi bir çözünürlük değerlerini kabul edebilir şablon fonksiyonları chronotürleri; saat, saniye, femtosaniye vb.

14 C ++ size daha fazla için hazır bilgi ekler içeren kod kolaylaştırabilirsiniz nanosecondsve 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);
}

Bir uykunun gerçek süresinin uygulamaya bağlı olduğuna dikkat edin: 10 nanosaniye uyumayı isteyebilirsiniz, ancak bir uygulama, yapabileceği en kısa süre buysa, bunun yerine bir milisaniye uykuya geçebilir.


4
Kullanıcı tanımlı değişmez son ekler. Kazdılar ... çok derin.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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

Bu da üç saniye uyuyacak. Yine de sayıları biraz daha hassaslaştırabilirsiniz.


Teşekkür ederim! Basit ve temiz çözüm. G ++ VS Code ile Mac derlemesinde çalıştı.
Z41N

18

Gibi basit bir şey ister misin

sleep(3);

Olması gerekiyor. Neredeyse evrenseldir. Hangi dilde / Derleyicide denediniz? Gerekli tüm kitaplıkları içe aktardınız mı?
JJ

4
Neden cevap olarak işaretlenmediğini veya çok fazla oy verilmediğini anlayamadım
ImranNaqvi

8

Bunun, iş parçacığının uyku süresinin uyku süresine yakın herhangi bir yerde olacağını garanti etmediğini, yalnızca iş parçacığının yürütülmeye devam etmesinden önceki sürenin en azından istenen miktar olacağını garanti ettiğini unutmayın. Gerçek gecikme, koşullara (özellikle söz konusu makinedeki yük) bağlı olarak değişiklik gösterecektir ve istenen uyku süresinden daha büyük sıralar olabilir.

Ayrıca, neden uyumak zorunda olduğunuzu listelemezsiniz, ancak genellikle gecikmeleri bir senkronizasyon yöntemi olarak kullanmaktan kaçınmalısınız.


4

Bu kod parçacığını deneyebilirsiniz:

#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

Mikrosaniye hassasiyet istiyorsanız select (2) 'yi de kullanabilirsiniz (bu, uykuya dalmamış platformlarda çalışır (3))

Aşağıdaki kod 1.5 saniye bekleyecektir:

#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

Evet, uyku muhtemelen burada seçimin işlevidir. İşleve geçen sürenin, çağıran iş parçacığının etkin olmayacağı en küçük süre olduğuna dikkat edin. Örneğin, 5 saniye ile uykuyu ararsanız, ipliğinizin en az 5 saniye uyuyacağı garanti edilir. İşletim sisteminin ne yaptığına bağlı olarak 6 veya 8 veya 50 olabilir. (Optimum işletim sistemi yürütmesi sırasında, bu 5'e çok yakın olacaktır.)
Uyku işlevinin bir başka kullanışlı özelliği de 0'a geçmektir. Bu, iş parçacığınızdan bir bağlam geçişini zorlayacaktır.

Bazı ek bilgiler:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html


3

Kitaplığı "_sleep(milliseconds);"eklerseniz (alıntılar olmadan) Win32 için iyi çalıştığını buldumchrono

Örneğin:

#include <chrono>

using namespace std;

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

Uyumadan önce alt çizgiyi eklediğinizden emin olun.


Bu işlevin yerini daha yeni kitaplık veya işletim sistemi işlevselliği almıştır. Bunun yerine Uykuyu kullanmayı düşünün.
ByWaleed

3

cpp'de çıktıyı sabit bir süre için geciktirmek için, Sleep () işlevi için windows.h üstbilgi dosyası sözdizimini ekleyerek Sleep () işlevini kullanabilirsiniz: Uyku (time_in_ms)

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

ÇIKTI. Yukarıdaki kod Apple'ı yazdıracak ve Mango yazdırmadan önce 3 saniye bekleyecektir.


2

Buradaki en iyi cevap, işletim sistemine bağlı bir cevap gibi görünüyor; Daha taşınabilir bir çözüm için, ctime başlık dosyasını kullanarak hızlı bir uyku işlevi yazabilirsiniz (bu benim açımdan zayıf bir uygulama olsa da).

#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

Sözdizimi:

geçersiz uyku (işaretsiz saniyeler);

sleep (), yürütmeyi bir aralık (saniye) için askıya alır. Bir uyku çağrısıyla, geçerli program, saniye bağımsız değişkeni tarafından belirtilen saniye kadar yürütmeden askıya alınır. Aralık, hangisi daha az doğruysa, yalnızca saniyenin en yakın yüzde biri kadar veya işletim sistemi saatinin doğruluğu için doğrudur.


0

Diğerleri uyumak için iyi bilgiler verdi. Wedge ile uykunun nadiren en uygun çözüm olduğuna katılıyorum.

Bir şeyi beklerken uyuyorsanız, aslında o şeyi / olayı beklemeniz daha iyidir. Bunun için Koşul Değişkenlerine bakın.

Bunu hangi işletim sisteminde yapmaya çalıştığınızı bilmiyorum, ancak iş parçacığı ve senkronizasyon için Boost Threading kitaplıklarına ( Boost Condition Varriable ) bakabilirsiniz .

Şimdi diğer uç noktaya geçersek, istisnai derecede kısa süreler beklemeye çalışıyorsanız, birkaç hack stili seçeneği vardır. Bir 'uykunun' uygulanmadığı bir tür gömülü platform üzerinde çalışıyorsanız, boş bir gövdeyle basit bir döngü (for / while vb.) Deneyebilirsiniz (derleyicinin onu optimize etmemesine dikkat edin). Elbette bu durumda bekleme süresi belirli donanıma bağlıdır. Gerçekten kısa 'beklemeler' için bir montaj "nop" deneyebilirsiniz. Bunların peşinde olduğunuz şey olduğundan şüpheliyim ama neden beklemeniz gerektiğini bilmeden daha spesifik olmak zor.


0

Windows'ta Windows kitaplığını ekleyebilir ve "Uyku (0)" seçeneğini kullanabilirsiniz; programı uyumak için. Milisaniyeleri temsil eden bir değer alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.