程序中的某些功能需要运行很长时间,以便用户可以中断它。结构是这样的:
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;
}
如果用户同时运行其中一个函数并单击右上角的exit,程序仍将在后台运行,直到循环结束。我试图释放void closeEvent(QCloseEvent *)中的资源:
void MainWindow::closeEvent(QCloseEvent *)
{
vp.stopIt();
}
但是由于vp1和vp2是局部变量,我不知道如何将它们传递给closeEvent()函数和free资源。任何建议将不胜感激。
答案 0 :(得分:4)
由于变量是在堆栈上创建的,因此它们将在其范围的最后自动释放(在您的情况下,在函数的结束}
处),您不必担心它们。
如果你想在函数结束之前释放它们,你需要重新实现这些函数,并且可能在函数之外自己为这些变量分配和释放内存。将它们传递给函数的方式(将它们作为函数参数传递,或将它们包含在类中)取决于您。
答案 1 :(得分:3)
你做不到。您应该在vp1
中将vp2
和MainWindow
声明为成员变量。
答案 2 :(得分:2)
据我了解OP的要求,他正在研究如何在主窗口关闭时中断someFunc1
或someFunc2
。
这些函数在GUI线程中运行,因此以下语句是一种误解
程序仍将在后台运行,直到循环结束
实际发生的情况是,程序运行直到函数完成,然后框架处理用户操作。因此,执行void MainWindow::closeEvent
时,后台没有运行任何内容,资源已被释放。
OP应该将someFunc1
和someFunc2
移动到工作线程。
答案 3 :(得分: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声明为成员变量。