如何在不冻结整个线程的情况下让函数等待

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 命令流,它要么运行,要么休眠(暂停/收起)(休眠),要么停止(或结束)。

您可以创建一个特殊线程,其中将是一个循环,并在循环内执行您感兴趣的任务并在您需要的时间休眠。

【讨论】:

以上是关于如何在不冻结整个线程的情况下让函数等待的主要内容,如果未能解决你的问题,请参考以下文章

如何在不冻结线程的情况下延迟答案? [复制]

如何在不刷新整个页面的情况下让 Grunt/Watch/LiveReload 重新加载 Sass/CSS?

如何在不冻结 GUI 的情况下在单个插槽中实现阻塞进程?

PyQt:如何在不冻结 GUI 的情况下更新进度?

如何在不改变高度的情况下让 SVG 具有流畅的宽度?

如何在不显式编译的情况下让 Visual Studio 错误检查我的代码(显示曲线)?