所以我有打印功能,我想在 5 秒内执行。问题是我想要函数中的所有其他内容。因此,例如,如果我的代码是:
// insert code here...
printf("(5 seconds later) Hello"); /* should be executed in 5 seconds */
printf("heya");
例如在主函数中。现在这是棘手的部分。虽然第一行应该在 5 秒内执行,但如果第一行根本不存在,第二行应该像正常一样执行。所以输出将是:
heya
(5 seconds later) Hello
如果您熟悉 Cocoa 或 Cocoa Touch,这正是 NSTimer 类的工作原理。使用 C++,是否有比使用线程更简单或内置的方式?如果没有,我将如何使用多线程来执行此操作?
最佳答案
使用 <chrono>
和 <thread>
,您可以创建一个非常简单但简单的:
std::thread printLater{[] {
std::this_thread::sleep_for(std::chrono::seconds(5));
printf("(5 seconds later) Hello");
}};
printf("heya");
printLater.join(); //when you want to wait for the thread to complete
Pubby 指出的另一种方法具有自动等待线程完成且在抛出异常时不停止的优点,即使用std::async
。 :
auto f = std::async(std::launch::async, [] {
std::this_thread::sleep_for(std::chrono::seconds(5));
printf("(5 seconds later) Hello");
});
printf("heya");
std::async
的结果存储到变量中意味着调用将启动一个新线程来运行该函数。如果不存储结果,则没有新线程。这是语言中的新问题之一。
请注意,打印时可能不会恰好在五秒后,并且没有输出同步,因此您可能会得到交错的输出 block (printf
是原子的,因此每次调用的整个输出都会交错)如果在每个线程中打印不止一个东西。如果没有同步,则无法保证哪些语句会在何时发生,因此如果您确实需要注意可能出现的同步问题,则应格外小心。不过,出于基本目的,这应该可行。
关于c++ - 创建一个计时器以在 X 秒内调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15777489/