因此,我试图编写一个C ++控制台程序,该程序在特定时间打开与Web浏览器的链接。时钟更新正常,shell行打开了链接,但是我无法让这两者一起工作。这是我的代码:
#include <Windows.h>
#include <shellapi.h>
#include <ctime>
#include <chrono>
#include <thread>
using namespace std;
int main(int argc, char* argv[])
{
string url = "https://www.google.com";
while (true) {
system("cls");
time_t now = time(0);
char* dt = ctime(&now);
cout << dt;
while (dt == "Mon May 18 09:48:00 2020") {
ShellExecute(NULL, "open", url.c_str(),
NULL, NULL, SW_SHOWNORMAL);
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
return 0;
}
至少对我来说,您的代码似乎有些混乱。目前尚不清楚为什么我们一次要睡一秒钟直到达到目标。更糟糕的是,如果其中一个睡眠呼叫发生时间太长,我们可能会超标,而永远不会执行所需的操作。更糟糕的是,如果我们确实达到了所需的时间,那么内循环看起来就像是一个无限循环,因为只要字符串具有所需的时间,内循环就将继续执行-但我们不会将字符串更新为当前时间,因此如果我们确实打了那个时间,字符串将永远保持不变。
至少根据您的描述,我们只想选择一个时间,睡到那时,然后执行命令。为此,看起来像这样的通用命令代码就足够了:
#include <windows.h>
#include <chrono>
#include <thread>
#include <iostream>
int main() {
// For the moment, I'm just going to pick a time 10 seconds into the future:
time_t now = time(nullptr);
now += 10;
// compute that as a time_point, then sleep until then:
auto then = std::chrono::system_clock::from_time_t(now);
std::this_thread::sleep_until(then);
// and carry out the command:
ShellExecute(NULL, "open", "https://www.google.com",
NULL, NULL, SW_SHOWNORMAL);
}
根据您的情况,您显然希望指定数据和时间。测试起来有点困难,但是从根本上来说并没有太大的不同。您可以将所需的日期/时间填充到struct tm
中,然后使用mktime
将其转换为time_t
。一旦有了time_t
,就可以像上面的代码一样使用std::chrono::system_clock::from_time_t
,然后从那里继续。如果需要从字符串开始,则可以使用std::get_time
将字符串数据转换为struct tm
。因此,对于您指定的日期/时间,我们可以执行以下操作:
#include <windows.h>
#include <chrono>
#include <thread>
#include <iostream>
#include <sstream>
#include <iomanip>
auto convert(std::string const &s) {
std::istringstream buffer(s);
struct tm target_tm;
buffer >> std::get_time(&target_tm, "%a %b %d %H:%M:%S %Y");
time_t target = mktime(&target_tm);
return std::chrono::system_clock::from_time_t(target);
}
int main() {
auto target = convert("Mon May 18 09:48:00 2020");
std::this_thread::sleep_until(target);
ShellExecute(NULL, "open", "https://www.google.com",
NULL, NULL, SW_SHOWNORMAL);
}