取消运行长操作的线程

Jos*_*osh 6 c++ oop multithreading design-patterns

我正在努力解决我的设计困境.

ClassWithLongOperation
{
    Run()
    {
        RecrusiveOperation();
    }

    RecrusiveOperation()
    {
        /* RECURSION */
    }
}

MyThread
{
    ClassWithLongOperation Op1(10);
    Op1.Run();  // Takes several minutes.

    ClassWithLongOperation Op2(20);
    Op2.Run();

    SomeOtherClassWithLongOperation Op3;
    Op3.Run();

    // Do some other stuff
}
Run Code Online (Sandbox Code Playgroud)

GUI启动MyThread,运行时间为5-6分钟.我希望能够在我的GUI上有一个大胖的取消按钮,因此用户可以取消操作.

我可以创建一个全局布尔变量bCancelled,并检查它是否已在RecursiveOperation中设置,但我想成为一个优秀的C++和OO程序员并避免全局变量.特别是如果它们必须分布在多个文件中.

那么我(按照良好的设计)如何安全地取消MyThread?我可以在设置中更改哪些内容以允许此操作?

我也_beginthreadex用来启动线程,但是如果能够提供更简单的解决方案,我可以使用boost.

dav*_*tto 4

您的标志不需要对整个程序是全局的,但它需要对您的类代码可见。创建标志作为私有实例成员和公共函数以将其更改为 false/true。在递归函数中,测试其值以验证任务是否应继续。当您需要时,将其值设置为 false(当然通过该函数)以停止递归调用,即,当用户单击按钮时,您将在所需实例中调用该函数。这样你就不会违反任何面向对象的原则,因为你有一个私有标志和一个公共成员函数来安全地更改它。