2009-12-16 179 views
2

我明白直接殺死線程的問題(通過AfxEndThread或其他方式),並且我已經看到了使用CEvent對象的示例來發信號通知線程,然後讓線程自行清理。我遇到的問題是使用CEvent發信號通知線程似乎需要一個循環,您可以檢查線程是否在循環結束時發出信號。問題是,我的線程不會循環。它只是運行,處理可能需要一段時間(這就是爲什麼我想能夠阻止它)。另外,如果我只是殺死線程,我意識到我分配的任何東西都沒有機會清理自己。在我看來,就像我曾經使用過的任何當地人一樣,將堆放在堆上的東西也無法清理自己。是這樣嗎?停止MFC線程

回答

0

您的線程是否退出?如果是這樣,您可以在退出時在線程中設置一個事件,讓主進程通過waitforsingleevent等待該事件。這是最好的做法,因爲主進程在關閉時不會鎖定。在超時事件中,通過AfxKillThread終止線程。不過,您必須確定合理的超時時間。

既然你不循環線程,這似乎是唯一的方法來做到這一點。當然,你可以在主進程中設置一個布爾標誌,並讓線程定期檢查這個標誌,但是你的線程代碼將會被「if(!canRun)return」所佔據。類型代碼。

如果線程永不退出,那麼AfxKillThread/AfxTerminateThread是停止線程的唯一方法。

0

當地人將被放置在堆棧上,因此,將被釋放強制關閉線程(我認爲)。析構函數不會被調用,並且線程持有的任何關鍵部分都不會被釋放。

但是,如果線程只處理棧中的簡單數據類型,那麼這是一件安全的事情。

2

這裏沒有祕密的魔法知識。

只需在整個功能代碼中定期檢查事件對象,並認爲它可以安全退出。