Làm cách nào để thêm thời gian trễ vào chương trình C ++?


93

Tôi đang cố gắng thêm thời gian trễ trong chương trình C ++ và tự hỏi liệu có ai có bất kỳ đề xuất nào về những gì tôi có thể thử hoặc thông tin tôi có thể xem không?

Tôi ước mình có thêm chi tiết về cách thực hiện thời gian trễ hẹn giờ này, nhưng cho đến khi tôi có thêm thông tin về cách thêm thời gian trễ, tôi không chắc về cách thậm chí tôi nên thử thực hiện điều này.


2
Nó phụ thuộc vào nền tảng (OS) nào và những thư viện nào bạn có sẵn.
Scott Langham

Câu trả lời:


79

Win32: Sleep(milliseconds)là những gì bạn là gì

unix: usleep(microseconds)là những gì bạn muốn.

sleep () chỉ diễn ra trong một số giây, thường là quá dài.


3
Ngoài ra còn có nanosleep () nếu usleep () không cung cấp cho bạn đủ độ phân giải.
Kristopher Johnson

9
Hãy nhớ rằng đối số cho các hàm này là thời gian ngủ TỐI THIỂU và KHÔNG đảm bảo bạn sẽ quay lại ngay nếu một quá trình khác đang làm hỏng CPU tại thời điểm đó.
billjamesdev

1
@Richard Harrison: Tôi phải bao gồm tiêu đề nào để cho phép sleep () hoạt động?
Overflowh

12
@Overflowh trên win32 Sleep () nằm trong windows.h; on unix sleep () in unistd.h
Richard Harrison,

1
@TommasoTheaCioni Ok, tôi giả sử ý bạn là, "Làm cách nào để chương trình khởi động lại chính xác khi bị trễ?", Và câu trả lời là ... bạn không thể. Bạn không kiểm soát hệ điều hành ở mức độ đó. Nếu một số chương trình khác đang ở giữa một số phân đoạn quan trọng, chương trình của bạn chỉ cần đợi.
billjamesdev

137

Câu trả lời được cập nhật cho C ++ 11:

Sử dụng các chức năng sleep_forsleep_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));
}

Với các chức năng này có không còn là một cần thiết phải liên tục bổ sung chức năng mới cho độ phân giải tốt hơn: sleep, usleep, nanosleepvv sleep_forsleep_untillà hàm mẫu mà có thể chấp nhận giá trị của độ phân giải bất kỳ thông qua chronocác loại; giờ, giây, femto giây, v.v.

Trong C ++ 14, bạn có thể đơn giản hóa mã hơn nữa với các hậu tố chữ cho nanosecondsseconds:

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

Lưu ý rằng thời lượng thực tế của một giấc ngủ phụ thuộc vào việc triển khai: Bạn có thể yêu cầu ngủ trong 10 nano giây, nhưng thay vào đó, một triển khai có thể kết thúc ngủ trong một mili giây, nếu đó là thời gian ngắn nhất mà nó có thể làm được.


4
Các hậu tố theo nghĩa đen do người dùng xác định. Họ đã đào ... quá sâu.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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

Điều này cũng sẽ ngủ trong ba giây. Bạn có thể tinh chỉnh các con số nhiều hơn một chút.


Cảm ơn bạn! Giải pháp đơn giản và sạch sẽ. Làm việc trên Mac biên dịch với G ++ VS Code.
Z41N

17

Bạn có muốn một cái gì đó đơn giản như

sleep(3);

Nó nên. Nó gần như phổ biến. Bạn đã thử nó bằng ngôn ngữ / Trình biên dịch nào? Bạn đã nhập tất cả các thư viện cần thiết?
JJ

3
Tôi không thể hiểu tại sao nó không được đánh dấu là câu trả lời hay không nhiều upvoted
ImranNaqvi

8

Lưu ý rằng điều này không đảm bảo rằng lượng thời gian luồng ngủ sẽ ở bất kỳ đâu gần với thời gian ngủ, nó chỉ đảm bảo rằng lượng thời gian trước khi luồng tiếp tục thực thi sẽ ít nhất là lượng mong muốn. Độ trễ thực tế sẽ khác nhau tùy thuộc vào hoàn cảnh (đặc biệt là tải trên máy được đề cập) và có thể là các mức độ lớn hơn thời gian ngủ mong muốn.

Ngoài ra, bạn không liệt kê lý do tại sao bạn cần ngủ nhưng nói chung bạn nên tránh sử dụng độ trễ như một phương pháp đồng bộ hóa.


4

Bạn có thể thử đoạn mã này:

#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

Bạn cũng có thể sử dụng select (2) nếu bạn muốn độ chính xác micro giây (điều này hoạt động trên nền tảng không có usleep (3))

Đoạn mã sau sẽ đợi trong 1,5 giây:

#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

Vâng, giấc ngủ có lẽ là chức năng của sự lựa chọn ở đây. Lưu ý rằng thời gian được truyền vào hàm là khoảng thời gian nhỏ nhất mà luồng đang gọi sẽ không hoạt động. Vì vậy, ví dụ: nếu bạn gọi chế độ ngủ với 5 giây, bạn được đảm bảo luồng của bạn sẽ ở chế độ ngủ trong ít nhất 5 giây. Có thể là 6, 8 hoặc 50, tùy thuộc vào hệ điều hành đang làm gì. (Trong quá trình thực thi hệ điều hành tối ưu, giá trị này sẽ rất gần với 5.)
Một tính năng hữu ích khác của hàm sleep là chuyển bằng 0. Điều này sẽ buộc chuyển đổi ngữ cảnh khỏi luồng của bạn.

Một số thông tin bổ sung:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html


3

Tôi thấy rằng "_sleep(milliseconds);"(không có dấu ngoặc kép) hoạt động tốt cho Win32 nếu bạn bao gồm chronothư viện

Ví dụ:

#include <chrono>

using namespace std;

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

Đảm bảo rằng bạn bao gồm dấu gạch dưới trước khi ngủ.


Chức năng này đã được bổ sung bởi thư viện hoặc chức năng hệ điều hành mới hơn. Thay vào đó, hãy cân nhắc sử dụng Sleep.
ByWaleed

3

để trì hoãn đầu ra trong cpp trong thời gian cố định, bạn có thể sử dụng hàm Sleep () bằng cách bao gồm cú pháp tệp tiêu đề windows.h cho hàm Sleep () là Sleep (time_in_ms) như

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

ĐẦU RA. mã trên sẽ in Apple và đợi 3 giây trước khi in Mango.


2

Câu trả lời hàng đầu ở đây dường như là câu trả lời phụ thuộc vào hệ điều hành; đối với một giải pháp di động hơn, bạn có thể viết một hàm ngủ nhanh bằng cách sử dụng tệp tiêu đề ctime (mặc dù đây có thể là một triển khai kém của tôi).

#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

Cú pháp:

giấc ngủ vô hiệu (giây không dấu);

sleep () tạm dừng thực thi trong một khoảng thời gian (giây). Với lệnh gọi ở chế độ ngủ, chương trình hiện tại bị tạm dừng thực thi trong số giây được chỉ định bởi đối số giây. Khoảng chính xác chỉ chính xác đến phần trăm giây gần nhất hoặc với độ chính xác của đồng hồ hệ điều hành, tùy theo khoảng nào kém chính xác hơn.


0

Nhiều người khác đã cung cấp thông tin tốt để ngủ. Tôi đồng ý với Wedge rằng một giấc ngủ hiếm khi là giải pháp thích hợp nhất.

Nếu bạn đang ngủ trong khi chờ đợi điều gì đó, thì tốt hơn hết bạn nên thực sự chờ đợi điều / sự kiện đó. Nhìn vào Biến điều kiện cho điều này.

Tôi không biết bạn đang cố gắng thực hiện việc này trên hệ điều hành nào, nhưng để phân luồng và đồng bộ hóa, bạn có thể tìm đến các thư viện Boost Threading ( Boost Condition Varriable ).

Bây giờ chuyển sang thái cực khác nếu bạn đang cố gắng chờ đợi trong khoảng thời gian đặc biệt ngắn thì có một số lựa chọn phong cách hack. Nếu bạn đang làm việc trên một số loại nền tảng nhúng mà 'chế độ ngủ' không được triển khai thì bạn có thể thử một vòng lặp đơn giản (for / while, v.v.) với phần thân trống (hãy cẩn thận trình biên dịch không tối ưu hóa nó). Tất nhiên thời gian chờ là phụ thuộc vào phần cứng cụ thể trong trường hợp này. Đối với các 'đợi' thực sự ngắn, bạn có thể thử một lắp ráp "nop". Tôi rất nghi ngờ đây là những gì bạn đang theo đuổi nhưng không biết tại sao bạn cần phải chờ đợi, thật khó để nói cụ thể hơn.


0

Trên Windows, bạn có thể bao gồm thư viện windows và sử dụng "Sleep (0);" để ngủ chương trình. Nó nhận một giá trị đại diện cho mili giây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.