Console无界面程序如何使用SetTimer
在Windows开发中免不了一些场景中是无界面的程序。但是我们又需要使用Windows API中的定时器SetTimer来进行定时处理一些任务。
我们都知道Windows是消息驱动的,那定时器SetTimer的超时也是通过消息来驱动的,Console进程主线程没有消息的循环分发,Windows是不会调用我们的超时回调函数的。
这种情况下,我们需要如何处理呢?
我们可以主动在当前线程中添加一个消息循环,来使当前线程中的消息分发下去,从而使定时器可以正常的运行。
在Demo中我创建了一个定时器,设置超时时间为3s,在超时回调函数中,获取当前时间并输出,可以比较清晰的看到执行的结果。
使用VS创建一个Console的工程,然后将代码复制进去就可以执行:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTimer)
{
//获取系统时间
SYSTEMTIME time;
GetLocalTime(&time);
char dateTimeStr[200] = { 0 };
sprintf_s(dateTimeStr, "%d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
std::cout << dateTimeStr << std::endl;
}
int main()
{
UINT_PTR uTimerID = SetTimer(NULL, 0, 3000, TimerProc);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
KillTimer(NULL, uTimerID);
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
阿木呀: 那需要在蓝图内进行编辑,在你需要的特定条件下,用整数1整除GetWorldDeltaSeconds(游戏中刷新每帧的时间),得出的结果打印出来即可
2301_80059307: 输入没有显示addItem咋回事,也有头文件
六号跑道01: 稍微补充一下: QMenu* m_menu = new QMenu(this); QAction* m_addAction = new QAction(m_menu); QAction* m_delAction = new QAction(m_menu); m_addAction->setText(QObject::tr("添加")); m_delAction->setText(QObject::tr("删除")); m_addAction->setCheckable(true);//是否可以check m_delAction->setCheckable(true);//是否可以check m_menu->addAction(m_addAction); m_menu->addAction(m_delAction); connect(m_addAction, &QAction::triggered, this, &MainWindow::addFunc); connect(m_delAction, &QAction::triggered, this, &MainWindow::delFunc); QPushButton* m_pushButton = new QPushButton(this); m_pushButton->setText(QObject::tr("测试按钮菜单")); m_pushButton->setMenu(m_menu);//设置菜单 //m_pushButton->setStyleSheet("QPushButton::menu-indicator{image:none;}");//不显示下拉图片[code=cpp] [/code]
六号跑道01: 没实现,不知道我错在哪里
一然明月: 一个编辑器开始地图 一个游戏默认地图 你看看你的游戏默认地图也设置了吗