2012-08-01 29 views
5

Có thư viện TimerCallback được triển khai bằng STL hay không. Tôi không thể mang phụ thuộc Tăng vào dự án của mình.Chức năng TimerCallback dựa trên mẫu tiêu chuẩn LIbrary mà không cần tăng cường

Bộ hẹn giờ hết hạn sẽ có thể gọi lại chức năng đã đăng ký.

+1

IMO, thay vì đưa vào thư viện, bạn có thể viết hẹn giờ của chính mình một cách nhanh chóng và gọn gàng. Sinh ra một chủ đề mới, liên tục gọi chức năng của bạn và sau đó làm cho thread ngủ một thời gian. – SuperSaiyan

Trả lời

8

Không có hẹn giờ cụ thể trong thư viện chuẩn, nhưng nó dễ dàng, đủ để thực hiện một:

#include <thread> 

template <typename Duration, typename Function> 
void timer(Duration const & d, Function const & f) 
{ 
    std::thread([d,f](){ 
     std::this_thread::sleep_for(d); 
     f(); 
    }).detach(); 
} 

Ví dụ về sử dụng:

#include <chrono> 
#include <iostream> 

void hello() {std::cout << "Hello!\n";} 

int main() 
{ 
    timer(std::chrono::seconds(5), &hello); 
    std::cout << "Launched\n"; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
} 

Ghi chú rằng chức năng được gọi vào thread khác, vì vậy đảm bảo mọi dữ liệu mà nó truy cập được bảo vệ phù hợp.

+0

Giải pháp tốt đẹp cảm ơn bạn, tuy nhiên, điều này chỉ hoạt động trong 'clang', g ++ 4.8.2 cho biết' error: field 'timer (const Duration &, const Function &) [với Duration = std :: chrono :: duration ; Hàm = void()] :: __ lambda0 :: __ f 'loại hàm khai báo không hợp lệ'. Bất kỳ ý tưởng? – Avio

+0

@Avio: Thay đổi đối số thành '& hello', để buộc chuyển đổi thành loại con trỏ. (Tôi không chắc liệu Clang hoặc GCC có suy ra đúng loại ở đây hay không, nhưng điều đó sẽ khiến cả hai làm những gì bạn muốn). –

Các vấn đề liên quan