Tạo thời gian chờ giữa các lệnh

Mọi người chỉ em cách tạo thười gian chờ giữa các câu lệnh vs ạ, kiểu như em muốn thực hiện xong câu lệnh này thì sau bao nhiêu thời gian đấy thì ms thực hiện tiếp câu lệnh sau ấy

Windows: sleep(1000 * seconds) :smiley:

6 Likes

Tuy không rành về C++, nhưng theo tui biết thì ngôn ngữ nào cũng thường sẽ có 2 cách để tạo hiệu ứng chờ như bạn muốn.

  • Cách 1 như bác ở trên là cho sleep cái thread đang chạy, bạn thêm thư viện windows là có hàm đấy.
  • Cách 2 thì chèn một vòng lặp cho đến khi đủ một giây trôi qua thì ngừng. Lấy clock (hoặc milisecond) hiện tại cộng thêm số clock trong 1 giây (hoặc mili second), rồi liên tục lấy clock hiện tại của máy so sánh với nó, ví dụ:
void wait( void ) {
    clock_t start = clock();;
    int     pause = CLOCKS_PER_SEC;
    printf("Loading");
    while( clock() < start + pause/3 );
    printf(".");
    while( clock() < start + pause*2/3 );
    printf(".");
    while( clock() < start + pause );
    printf(".");
}

Output là Loading và cứ mỗi 1/3 giây sẽ in ra dấu chấm, tạo hiệu ứng loading :slight_smile:

1 Like

Quay kiểu này mất hết 1 core cho ông quay (busy waiting).

6 Likes

Chờ giữa các function này thường xảy ra khi thao tác với một phần cứng bên ngoài. Khi bạn không biết chính xác khi nào thì thằng hw sẽ làm việc xong.
Nhưng đa số các hw đều có interrupt để thông báo hoàn tất công việc. Vì vậy thay vì mình sử dụng hỏi vòng thì hãy sử dụng interrupt để thông báo cho CPU có phải tốt hơn không?

1 Like

C++ hiện đại có this thread sleep for :V

std::this_thread::sleep_for(100ms);

https://en.cppreference.com/w/cpp/thread/sleep_for

#include <iostream>
#include <chrono>
#include <thread>
 
int main()
{
    using namespace std::chrono_literals; // để xài s/ms/us/ns ví dụ 1 giây là 1s, nửa giây là 500ms, v.v...
    std::cout << "Hello waiter" << std::endl;
    auto start = std::chrono::steady_clock::now();
    std::this_thread::sleep_for(2s); // ngủ 2 giây
    auto end = std::chrono::steady_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end-start;
    std::cout << "Waited " << elapsed.count() << " ms\n";
}
8 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?