1

I want to forcibly stop the thread created by dispatch_async if its in use for too much time, for example pass over 5 minutes. By searching over the internet, I got some one thought there was no way to stop the thread, does any one know that?

In my imagine, I want to create a NSTimer to stop the thread when time specified passed.

+ (void)stopThread:(NSTimer*)timer
{
    forcibly stop the thread???
}

+ (void)runScript:(NSString *)scriptFilePath
{
    [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(stopThread:) userInfo:nil repeats:NO];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [LuaBridge runLuaFile:scriptFilePath];

    });
} 

My runLuaScript method:

+ (void)runLuaFile:(NSString *)filePath
{

    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    int error2 = luaL_dofile(L, [filePath fileSystemRepresentation]);
    if (error2) {
        fprintf(stderr, "%s", lua_tostring(L, -1));
        lua_pop(L, 1);
    }

    lua_close(L);
}

Dear @Martin R, should I use lstop like that, and when I want to stop the thread, just call stopLuaRunning method?

static lua_State *L = NULL;

+ (void)runLuaFile:(NSString *)filePath
{

    L = luaL_newstate();
    luaL_openlibs(L);

    int error2 = luaL_dofile(L, [filePath fileSystemRepresentation]);
    if (error2) {
        fprintf(stderr, "%s", lua_tostring(L, -1));
        lua_pop(L, 1);
    }

    lua_close(L);
}

+ (void)stopLuaRunning:(lua_State *L)
{
    lua_sethook(L, NULL, 0, 0);
    luaL_error(L, "interrupted!");
}
4

4 に答える 4

3

NSOperationandを使用する必要がありNSOperationQueueます。キャンセルのサポートが組み込まれているため、操作がキャンセルされたかどうかを確認でき、タイマーcancelが操作を呼び出すだけです。

于 2013-07-16T08:42:34.607 に答える
0

スレッドを止める方法はありませんでしたが、インターネットで検索したところ、いくつかありましたが、誰か知っていますか?

気にしないでください。止めるのはあなたではありません。キューへの参照がある場合は、呼び出すことができdispatch_release、適切なタイミングで破棄されますが、グローバル キューではこれを行いません。

そのスレッドを強制終了すると、キューのプール内のスレッドが強制終了されるだけであり、未定義の動作と同じように考慮されるべきです。

スレッドの存続期間を制御したい場合は、独自のスレッドを作成し、その実行ループと対話します。ただし、プログラムが実装から正常に戻ることを確認してください。機能しない、または戻ってこないという理由で、単に何かを殺してはいけません。Martin R は、これがどのように発生するかについて言及しました。タスクが不正になった場合に、タスクはタイムアウト、キャンセル、またはそれ自体を停止する別の手段をサポートする必要があります。

Wain's は、良い妥協点についても言及しています。

于 2013-07-16T09:24:26.030 に答える