0

我的程序中的某些功能需要运行很长时间,以便用户可能会中断它。结构是这样的:

int MainWindow::someFunc1()
{
    //VP is a class defined somewhere.
    VP vp1;
    //the for loop that needs time to execute.
    return 0;
}

int MainWindow::someFunc2()
{
    VP vp2;
    //another loop that consumes time.
    return 0;
}

如果用户运行其中一个函数或同时运行并单击右上角的退出,程序仍将在后台运行,直到循环结束。我尝试在 void closeEvent(QCloseEvent *) 中释放资源:</p>

void MainWindow::closeEvent(QCloseEvent *)
{
    vp.stopIt();
}

但是由于 vp1 和 vp2 是局部变量,我不知道如何将它们传递给 closeEvent() 函数并释放资源。任何建议将不胜感激。

4

4 回答 4

4

由于变量是在堆栈上创建的,因此它们将在其作用域结束时自动释放(}在您的情况下是在函数关闭时),您不必担心它们。

如果你想在函数结束之前释放它们,你需要重新实现函数,并且可能在函数之外自己为这些变量分配和释放内存。您将它们传递给函数的方式(将它们作为函数参数传递,或者将它们包含到类中)取决于您。

于 2012-08-15T11:48:46.900 回答
3

你不能。您应该将vp1and声明vp2MainWindow成员变量。

于 2012-08-15T11:48:45.683 回答
2

据我了解 OP 的要求,他正在寻找如何中断someFunc1someFunc2何时关闭主窗口。

那些函数在GUI线程中运行,所以下面的说法是一个误解

程序仍将在后台运行,直到循环完成

实际发生的情况是,程序运行直到功能完成,然后用户操作由框架处理。因此,当void MainWindow::closeEvent执行时,后台没有任何东西在运行,并且资源已经被释放。

OP 应该移动someFunc1someFunc2一个工作线程。

于 2012-08-15T12:32:23.207 回答
0

从理论上讲,您可以使用 setjmp 执行此操作。这些方面的东西:

#include "setjmp.h"

jmp_buf doNotAttempt;
jmp_buf badPractice;

int MainWindow::someFunc1()
{
    VP vp1;
    for (...) {
        // do stuff
        if (setjmp(doNotAttempt)) { /*free resources, then: */ longjmp(badPractice,1); }
    }
    return 0;
}

// [...]

void MainWindow::closeEvent(QCloseEvent *)
{
    if (!setjmp(badPractice))
        longjmp(doNotAttempt,1);
    else
        // do the same for your other loop
}

在实践中,不要这样做——出于各种原因,这是一个糟糕的主意。正如其他人所说,只需将 vp1 和 vp2 声明为成员变量。

于 2012-08-15T12:15:43.233 回答