2010-01-18 15 views
0

創建的線程的名字,我用下面設定的SetTimer()API

FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod)); 

這是線程在Delphi的「新語絲」窗口中創建一個Windows計時器。如果是,我怎麼能得到這個線程ID?

回答

5

該函數沒有創建線程。當您的程序處理wm_Timer消息時,操作系統調用回調函數。它是從同一個線程調用的,這個線程調用了SetTimer,所以線程最好有一個消息泵。 (它是從主VCL線程調用的,然後消息泵由TApplication類爲您提供。)

此外,SetTimer不返回句柄。它返回一個計時器ID。

最後,除非該方法是class static方法,否則它將無法按照您希望的方式工作。如果回調的簽名與SetTimer希望您提供的內容相匹配,則不需要類型轉換,因此如果需要鍵入函數指針以使編譯器接受您的代碼,則可能是錯誤的。

+0

+1,因爲你比我花了一分多的時間,寫了一個非常完整的答案:) – jpfollenius 2010-01-18 16:06:03

+0

是的,除了挑選一個「ID」是否是一個「句柄」之外,還有很好的答案。一些句柄*只是ID,一些句柄是指針。做出區分很可能會引起不必要的問題,即應如何處理ID(原文如此)與句柄不同。 – Deltics 2010-01-18 19:35:41

+0

並非所有句柄都是ID,並非所有ID都是句柄。將兩者聯繫起來阻礙溝通。如果你告訴人們你有一個「定時器手柄」,他們很可能認爲你在談論一個等待定時器,這根本不是一回事。將定時器事件ID當作句柄的想法可能會誘使你調用它的句柄相關函數,如DuplicateHandle或CloseHandle,但這是不允許的。如果文檔調用某個ID,然後將其稱爲ID。 – 2010-01-18 20:18:01

3

SetTimer不會創建線程,但會在指定的超時後在主線程的上下文中調用指定的函數。如果您沒有傳遞迴調函數,SetTimer會將WM_TIMER消息發佈到您的主窗口類。

查看MSDN reference for SetTimer瞭解更多信息。