2010-02-04 162 views
2

我編寫一個具有兩個線程的服務應用程序。 第一個線程,顯示帶有標籤的表單。 第二個線程,查詢ADO。Delphi線程凍結

第一個線程總是用沙漏光標凍結而沒有標籤標題。

請幫忙。

+2

你的代碼是什麼? – 2010-02-04 03:44:34

+4

服務有** no **業務顯示任何窗口。如果右旋鈕旋轉(允許與桌面交互),它可以在較舊的Windows版本中工作,但在Vista中,MS開始積極地阻止其工作。 – mghie 2010-02-04 10:33:16

+1

歡迎來到Stack Overflow,Tea。看起來有人低估了你的問題,因爲寫得不好。爲了將來的參考,如果您添加代碼示例以幫助我們瞭解您正在嘗試執行的操作,它確實會有所幫助。但是,看起來你有很好的,有用的答案,但Mghie和Allen。 – 2010-02-04 17:08:58

回答

4

如果您嘗試從主線程而不是線程中顯示窗體,那麼您將遇到類似這樣的奇怪事情。其中最值得注意的是,如果表單和標籤是在非主線程中創建的,那麼您沒有消息循環來處理消息。如果表單是在主線程中創建的,但是您試圖從非主線程中顯示它,那麼由於Windows處理消息和線程的方式可能會導致死鎖。

當創建窗口句柄時,它將綁定到創建窗口句柄的線程。這意味着Windows將確保發送到該句柄的任何消息都在該線程上處理。

我強烈建議您閱讀窗口消息,消息隊列和句柄如何在多線程環境中交互和運行。如果做得不對,你可以確定一些非常奇怪且可能無法預測的行爲。

+1

看起來這個人會受益於一本巨書,就像Marco Cantu的超過800頁的Delphi書籍一樣。 – 2010-02-10 17:00:57

0

我會把你的情況稱爲種族,死鎖或其他類似的錯誤。正如Allen所說,如果後臺線程可以直接訪問VCL控件,而不使用TThread.Synchronize(myMethod)來調用觸及您的VCL前臺的myMethod,那麼這僅僅會導致您的麻煩。

發佈更多信息,包括你的代碼示例。