如何在不冻结整个线程的情况下让函数等待
Posted
技术标签:
【中文标题】如何在不冻结整个线程的情况下让函数等待【英文标题】:How can i make a function wait without freezing the whole thread 【发布时间】: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) 然后进入主循环
【参考方案1】:
线程是一个 CPU 命令流,它要么运行,要么休眠(暂停/收起)(休眠),要么停止(或结束)。
您可以创建一个特殊线程,其中将是一个循环,并在循环内执行您感兴趣的任务并在您需要的时间休眠。
【讨论】:
以上是关于如何在不冻结整个线程的情况下让函数等待的主要内容,如果未能解决你的问题,请参考以下文章