【发布时间】:2021-08-28 23:19:19
【问题描述】:
bool find1(const char* name)
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
auto snapshot = LI_FN(CreateToolhelp32Snapshot).safe()(TH32CS_SNAPPROCESS, NULL);
if (LI_FN(Process32First).safe()(snapshot, &entry) == TRUE)
{
while (LI_FN(Process32Next).safe()(snapshot, &entry) == TRUE)
{
if (strstr(entry.szExeFile, name))
{
return true;
}
}
}
LI_FN(CloseHandle).safe()(snapshot);
return false;
}
我将这段代码包含在一个 void 中,它会在每个滴答声中自行执行。这大大滞后了应用程序,所以我需要每 5 秒运行一次。如何在不休眠整个线程的情况下添加延迟或休眠(在我的情况下,应用程序完全冻结)
编辑(查看是否打开了程序) 此脚本将用于查找和关闭在应用程序运行时打开的所有调试程序,因此我需要它持续运行。
【问题讨论】:
-
你不能休眠一个线程的一部分,但你可以添加另一个线程。
-
大概你有一个消息循环或某处。跟踪您上次运行检查的时间和当前时间。当自上次以来经过 5 秒或您喜欢的任何时间段时,再次调用该函数并重置上次时间变量。
-
如果您不希望此代码阻塞 UI 线程,请将其移至单独的工作线程。此外,此代码正在跳过报告的第一个进程,使用
do..while循环而不是loop。此外,如果找到匹配的名称,此代码不会关闭snapshot。 -
"included in a void" -- 听起来你已经让这段代码不再存在(空白空间的一部分,又名a void)。你的意思是这段代码是从一个函数调用的(函数的返回类型恰好是
void,但这个细节与这个问题无关)? -
你可以创建另一个线程,当新线程接收到上面代码调用的 wm_timer 时,SetTimer(5 sec) 然后进入主循环