2012-08-15 28 views
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; 
} 

如果用戶運行的功能,或在同一時間要麼,點擊右上角退出,程序仍會在後臺運行,直到循環結束。我試圖釋放資源,無效的closeEvent(QCloseEvent *):

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

但是因爲VP1和VP2是局部變量,我不知道如何將它們傳遞到的closeEvent()函數和免費資源。任何建議將不勝感激。

+1

當它們都在主GUI線程中時,'someFunc1'和'someFunc2'如何同時運行?在類似的說明中,您應該在GUI線程中不執行長時間運行的任務(它會導致GUI意外凍結),並將它們放入單獨的線程中。 – cmannett85 2012-08-15 11:49:52

回答

3

你不能。您應該在MainWindow中聲明vp1vp2作爲成員變量。

+0

嗯,這是一個好主意。但是如果有幾乎10個函數像someFuncX()呢?我應該定義10個成員變量還是更改我的功能設計? – user957121 2012-08-15 12:46:43

+1

std :: vector 怎麼樣? – Moritz 2012-08-15 12:55:27

4

由於變量是在堆棧中創建的,因此它們將在其作用域的末尾自動釋放(在您的案例的函數關閉}處),您不必擔心它們。

如果你想在之前釋放它們函數結束,你需要重新實現函數,並且可能在函數之外爲你自己分配和釋放這些變量的內存。您將它們傳遞給函數的方式(將它們作爲函數參數傳遞,或將它們包含到類中)取決於您。

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聲明爲成員變量即可。

2

據我瞭解OP的要求,他正在尋找當主窗口關閉時如何中斷someFunc1someFunc2

這些功能在GUI線程中運行,因此下面的語句是一種誤解

程序仍然會在後臺運行,直到循環結束

居然會發生什麼,程序運行直到函數完成,然後用戶動作由框架處理。因此,當執行void MainWindow::closeEvent時,後臺沒有任何內容在運行,並且資源已經釋放。

OP應將someFunc1someFunc2移動到工作線程。