我已經編寫了一個應用程序(使用Delphi 2009),允許用戶選擇一系列可以在多個不同系統上運行的查詢。爲了允許查詢同時運行,每個查詢都使用TADOQuery對象在其自己的線程中運行。這一切工作正常。多線程(TThread)Delphi應用程序不會終止
我的問題是,當我試圖關閉應用程序時,查詢仍在運行(並因此單獨的線程處於活動狀態)。當我創建每個線程時,我將線程的THandle記錄在一個數組中。當我嘗試關閉應用程序時,如果有任何線程仍在運行,我檢索線程的句柄並將其傳遞給TerminateThread,理論上這應該終止線程並允許應用程序關閉。但是,這不會發生。主窗體的onClose事件被觸發,看起來應用程序正在關閉,但進程保持活動狀態,並且我的Delphi界面顯示爲應用程序仍在運行(即「運行」按鈕呈灰色,調試視圖處於活動狀態等)。直到我手動結束進程(在Delphi中使用Ctrl-F2或通過任務管理器),我纔得到控制權返回給Delphi。
我正在使用TerminateThread,因爲查詢可能需要很長時間才能運行(如果我們正在處理一百萬左右的記錄(在最終用戶環境中這是完全可能的),並且它是運行,除非我錯了,線程將無法檢查Terminated屬性,因此如果在查詢返回之前設置爲True,將無法自行結束,因此我無法終止線程以通常的方式(即通過檢查Terminated屬性)。在大型查詢運行時,用戶可能希望退出應用程序,在這種情況下,我需要應用程序立即結束(即所有正在運行的線程立即終止),而不是強制它們等待所有查詢完成運行,所以TerminateThread將是理想的,但它並沒有真正終止線程!
任何人都可以在這裏幫忙嗎?有誰知道爲什麼TerminateThread無法正常工作?任何人都可以建議任何事情,讓線程運行大型ADO查詢立即終止?
感謝您的幫助!
這看起來像前進的道路。過去一週左右我一直在做別的事情,但我會在接下來的幾天看看。你有沒有這方面的任何資源的例子? – Jeedee