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

できません。vp1vp2MainWindowメンバー変数として宣言する必要があります。

于 2012-08-15T11:48:45.683 に答える
2

OPの要件を理解している限り、彼は中断する方法someFunc1someFunc2メインウィンドウが閉じられたときに探しています。

これらの関数は GUI スレッドで実行されるため、次のステートメントは誤解です

ループが終了するまで、プログラムはバックグラウンドで実行されます

実際には、関数が完了するまでプログラムが実行され、ユーザーのアクションがフレームワークによって処理されます。したがって、void MainWindow::closeEventが実行されると、バックグラウンドで何も実行されておらず、リソースは既に解放されています。

OP はワーカー スレッドに移動する必要がsomeFunc1あります。someFunc2

于 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 に答える