2011-12-07 39 views
0

我有一個類創建作爲一個線程。哪個線程是處理對象的事件處理?

在那個類中,我創建了一個對象。這個對象有一個事件,它對我的​​線程類中創建的方法執行回調。

那麼,我的主應用程序/ GUI線程創建這個線程&啓動它。

此時,我的主要GUI線程處於空閒狀態(等待鍵盤事件)&我的線程的execute方法位於無限循環(等待終止)。

然後,創建的對象檢測到一些事件,觸發一個事件,這會觸發回調到線程類方法。

接下來的問題是,這個方法執行哪個線程/進程? 我的主應用程序線程(& GUI處理程序)? 或者我開始的線程,它創建了觸發事件/回調的對象?

我假設主應用程序線程被中斷。這是正確的嗎?

+0

您還沒有提供足夠的信息來說明執行回調的線程。回調可能是一個APC排隊到創建該對象的線程(即'我開始的線程'),或直接從內核線程回調或從另一個進程通過線程回調。共享內存。您的主應用程序線程可能會或可能不會在回調時運行 - 通常,對於任何可能正在運行主線程的處理器內核而言,沒有理由因爲某些回調已被某些地方執行而被中斷線。 –

+0

@馬丁詹姆斯他沒有提供足夠的信息,因爲他是通靈但忘了我們不是:) –

回答

0

這裏沒有什麼魔法,事件處理程序只是簡單地運行在與觸發事件的代碼相同的線程上。當你希望事件處理程序更新UI時,這總是很麻煩,這不是從創建UI對象的任何線程執行合法的。

您將不得不將工作線程的調用編組到UI線程。無論您使用UI實現什麼樣的類庫,它都會受到支持。你沒有說,它聞起來像Winforms,在這種情況下,你使用Control :: BeginInvoke()。如果它是原始Windows,那麼你使用PostMessage()。等等。

0

回調在等待事件並調用回調的線程上執行。在這種情況下,它是你的工作線程。

您的主線程(GUI線程)不會中斷,不計算操作系統中斷執行潛在的上下文切換。