2013-04-25 147 views
1

我有一個主線程,創建另一個線程來執行一些工作。主線程有對該線程的引用。即使線程仍在運行,我如何在一段時間後強制終止該線程。我找不到適當的函數調用。如何殺死線程從另一個線程在vala

任何幫助將是可觀的。

我想解決的原始問題是我創建了一個線程來執行CPU綁定操作,可能需要1秒鐘才能完成或可能需要10個小時。我無法預測它將花費多少時間。如果花費太多時間,我希望它在我/我想要時優雅地放棄工作。我可以以某種方式將此消息傳達給該線程?

+0

你爲什麼要殺死線程?你真的想做什麼? – razeh 2013-04-25 16:46:13

+0

我編輯了問題陳述來解釋我想要做什麼 – imagin 2013-04-25 17:20:33

+0

Appart由於內存泄漏,您將留下大量處於未知狀態的數據。這幾乎不是一個好主意。指示線程停止,並檢查停止請求。 – 2013-04-25 17:28:33

回答

3

假設你正在談論一個GLib.Thread,你不能。即使你可以,你可能也不想,因爲你可能最終會泄漏大量的內存。

你應該做的是要求線程自己殺死。一般來說,這是通過使用變量來指示是否已請求操作儘早停止。 GLib.Cancellable專爲此目的而設計,它與GIO中的I/O操作集成在一起。

例子:

private static int main (string[] args) { 
    GLib.Cancellable cancellable = new GLib.Cancellable(); 
    new GLib.Thread<int> (null,() => { 
     try { 
     for (int i = 0 ; i < 16 ; i++) { 
      cancellable.set_error_if_cancelled(); 
      GLib.debug ("%d", i); 
      GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 100); 
     } 

     return 0; 
     } catch (GLib.Error e) { 
     GLib.warning (e.message); 
     return -1; 
     } 
    }); 

    GLib.Thread.usleep ((ulong) GLib.TimeSpan.SECOND); 
    cancellable.cancel(); 

    /* Make sure the thread has some time to cancel. In an application 
    * with a UI you probably wouldn't need to do this artificially, 
    * since the entire application probably wouldn't exit immediately 
    * after cancelling the thread (otherwise why bother cancelling the 
    * thread? Just exit the program) */ 
    GLib.Thread.usleep ((ulong) GLib.TimeSpan.MILLISECOND * 150); 

    return 0; 
} 
+0

這裏我們必須檢查每個循環中的cancellable.set_error_if_cancelled()以檢查它是否已被取消,我可以在新線程開始時執行某些操作,以確保取消時終止它,因爲新線程執行沒有這種類型的簡單循環,我可以檢查它..我無法檢查這種情況後,每個有意義的代碼塊。 – imagin 2013-04-26 13:28:46

+0

不可以。爲什麼你不能在每個有意義的代碼塊之後檢查它?您只需將可取消消息傳遞給您從線程回調調用的任何方法,並讓它們引發異常。然後,它只是一個偶爾的cancellable.set_error_if_cancelled()調用,這不是非常困難。 – nemequ 2013-04-26 19:06:19

+1

也許你問的是錯誤的問題。與其詢問如何殺死一個線程(像glib線程,就像我說過的那樣,你不能),也許你應該問如何做一個長時間運行的CPU密集型操作,爲此你不能(或者不能) t)修改代碼,可取消...在這種情況下,答案將是使用進程而不是線程。 – nemequ 2013-04-26 19:14:08