我有一個主線程,創建另一個線程來執行一些工作。主線程有對該線程的引用。即使線程仍在運行,我如何在一段時間後強制終止該線程。我找不到適當的函數調用。如何殺死線程從另一個線程在vala
任何幫助將是可觀的。
我想解決的原始問題是我創建了一個線程來執行CPU綁定操作,可能需要1秒鐘才能完成或可能需要10個小時。我無法預測它將花費多少時間。如果花費太多時間,我希望它在我/我想要時優雅地放棄工作。我可以以某種方式將此消息傳達給該線程?
我有一個主線程,創建另一個線程來執行一些工作。主線程有對該線程的引用。即使線程仍在運行,我如何在一段時間後強制終止該線程。我找不到適當的函數調用。如何殺死線程從另一個線程在vala
任何幫助將是可觀的。
我想解決的原始問題是我創建了一個線程來執行CPU綁定操作,可能需要1秒鐘才能完成或可能需要10個小時。我無法預測它將花費多少時間。如果花費太多時間,我希望它在我/我想要時優雅地放棄工作。我可以以某種方式將此消息傳達給該線程?
假設你正在談論一個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;
}
這裏我們必須檢查每個循環中的cancellable.set_error_if_cancelled()以檢查它是否已被取消,我可以在新線程開始時執行某些操作,以確保取消時終止它,因爲新線程執行沒有這種類型的簡單循環,我可以檢查它..我無法檢查這種情況後,每個有意義的代碼塊。 – imagin 2013-04-26 13:28:46
不可以。爲什麼你不能在每個有意義的代碼塊之後檢查它?您只需將可取消消息傳遞給您從線程回調調用的任何方法,並讓它們引發異常。然後,它只是一個偶爾的cancellable.set_error_if_cancelled()調用,這不是非常困難。 – nemequ 2013-04-26 19:06:19
也許你問的是錯誤的問題。與其詢問如何殺死一個線程(像glib線程,就像我說過的那樣,你不能),也許你應該問如何做一個長時間運行的CPU密集型操作,爲此你不能(或者不能) t)修改代碼,可取消...在這種情況下,答案將是使用進程而不是線程。 – nemequ 2013-04-26 19:14:08
你爲什麼要殺死線程?你真的想做什麼? – razeh 2013-04-25 16:46:13
我編輯了問題陳述來解釋我想要做什麼 – imagin 2013-04-25 17:20:33
Appart由於內存泄漏,您將留下大量處於未知狀態的數據。這幾乎不是一個好主意。指示線程停止,並檢查停止請求。 – 2013-04-25 17:28:33