【问题标题】:How i can implement a BackgroundWorker in C++ STL我如何在 C++ STL 中实现 BackgroundWorker
【发布时间】:2019-05-08 20:24:45
【问题描述】:

你好,我是 C++ 的新手,特别是 STL,

我需要创建一个具有无限循环的函数来计算和处理大数据(例如遗传算法),但我还需要保持 Ui 响应并在(每轮之后)更新它无限循环和手动启动/停止操作。

类似这样的:

bool working = false;
void do_process()
{
    while(working)
    {
       // do some stuff
    }
}

void btnStart()
{
    working = true; 
    do_process();
}

void btnEnd()
{
    working = false;
}

请您指导我找到一个没有任何 3rdparty 库的正确解决方案,谢谢。

并为糟糕的英语道歉。

【问题讨论】:

  • 如果您想继续按下按钮以排队更多 do_process 作业,请查看 std::vector 以根据需要存储额外的 std::threads ... Buuuuut... 这通常一个坏主意,因为太多线程开始争夺对 CPU 和其他资源的访问权限。必须维护vector 并在线程过期后进行清理也很痛苦。取而代之的是look into thread pools

标签: c++ multithreading stl


【解决方案1】:

下面的代码应该可以帮助您入门。但要小心,对于有经验的用户来说,实现多线程应用程序通常也是一个难题。需要大量有关内存访问同步和死锁分析的知识。考虑下面的例子是非常重要的。例如,在 btnStart 和 btnStop 中,您应该检查一个线程是否已经在运行。检查全局 bool working 可能需要同步。同样,检查空指针可能需要同步。归根结底,它比看起来要复杂得多。

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <memory>

bool working = false;
std::unique_ptr<std::thread> t;

void do_process()
{
    while(working)
    {
        std::cout << "Hi. I am a secondary thread and I am running.\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void btnStart()
{
    working = true;
    t.reset(new std::thread(do_process)); // start the thread
}

void btnEnd()
{
    working = false;  // inform the thread of termination
    t->join();        // wait for thread termination
    t.reset(NULL);
}

int main()
{
    std::cout << "Hi, I am the main thread.\n";
    std::cout << "I'll now launch another thread and sleep for a while\n";
    btnStart();
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    btnEnd();
    std::cout << "What happened while I was slepping?\n";
    return 0;
}

【讨论】:

  • 非常好的答案,但这里有no need for the std::unique_ptr,我会采取额外的步骤并为working 演示std::atomic。装甲btnStart 以便没有人破坏当前正在运行的线程我将留给另一个问题。
  • 已解决;我的问题是关于 unique_ptr,谢谢,不幸的是我没有足够的声誉给你分数-;)
  • @user4581301 我不能(不应该)使用 std::atomic
  • @Hamed 不解。我能问为什么不吗?这是一个非常简单(因为它隐藏了很多真正令人讨厌的东西)的解决方案。
  • @user4581301 某种公司规定,此算法必须适用于便携式设备,而不是 pc 或 mac。
【解决方案2】:

我对 c++ 也很陌生,但我有一些可能会有所帮助的东西。 当我想运行代码更新之类的东西或运行外部的东西而不用代码填充我的原始项目时,我喜欢使用ShellExecute 来运行另一个 c++ 程序或外部程序。要使用ShellExecute,您需要#include&lt;windows.h&gt;

例如,如果我想更新我的程序,我使用#include&lt;fstream&gt;#include&lt;windows.h&gt;#include&lt;string&gt; 来检查名为“updatereq.txt”的文件中的值(我将其设为我自己)。在我的程序中,我运行ifstream 来检查文件是否有“1”。如果if 语句检测到'1',它会这样做:

void Update(string filename)
{
    ShellExecute(NULL,"open",filename.c_str(),NULL,NULL,SW_SHOWNORMAL)
}

这将运行: HWND设置为NULL,操作设置为:"open",文件设置为字符串:filenameconstant,参数设置为NULL,目录设置为NULL(将在最初启动的目录中运行,通常在主文件中),并将模式设置为SW_SHOWNORMAL,它将正常运行在您面前。这也是SW_SHOWMINIMIZEDSW_SHOWMAXIMIZED

希望这会有所帮助!

PS:记得在调用这个函数的时候提到你要运行的文件/程序名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2013-05-08
    • 2014-08-26
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多