創建的線程的名字,我用下面設定的SetTimer()API
FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod));
這是線程在Delphi的「新語絲」窗口中創建一個Windows計時器。如果是,我怎麼能得到這個線程ID?
創建的線程的名字,我用下面設定的SetTimer()API
FHandle := SetTimer(0, 0, 1000, TFNTimerProc(@TMyClass.MyMethod));
這是線程在Delphi的「新語絲」窗口中創建一個Windows計時器。如果是,我怎麼能得到這個線程ID?
該函數沒有創建線程。當您的程序處理wm_Timer
消息時,操作系統調用回調函數。它是從同一個線程調用的,這個線程調用了SetTimer
,所以線程最好有一個消息泵。 (它是從主VCL線程調用的,然後消息泵由TApplication
類爲您提供。)
此外,SetTimer
不返回句柄。它返回一個計時器ID。
最後,除非該方法是class static
方法,否則它將無法按照您希望的方式工作。如果回調的簽名與SetTimer
希望您提供的內容相匹配,則不需要類型轉換,因此如果需要鍵入函數指針以使編譯器接受您的代碼,則可能是錯誤的。
SetTimer
不會創建線程,但會在指定的超時後在主線程的上下文中調用指定的函數。如果您沒有傳遞迴調函數,SetTimer
會將WM_TIMER
消息發佈到您的主窗口類。
查看MSDN reference for SetTimer瞭解更多信息。
+1,因爲你比我花了一分多的時間,寫了一個非常完整的答案:) – jpfollenius 2010-01-18 16:06:03
是的,除了挑選一個「ID」是否是一個「句柄」之外,還有很好的答案。一些句柄*只是ID,一些句柄是指針。做出區分很可能會引起不必要的問題,即應如何處理ID(原文如此)與句柄不同。 – Deltics 2010-01-18 19:35:41
並非所有句柄都是ID,並非所有ID都是句柄。將兩者聯繫起來阻礙溝通。如果你告訴人們你有一個「定時器手柄」,他們很可能認爲你在談論一個等待定時器,這根本不是一回事。將定時器事件ID當作句柄的想法可能會誘使你調用它的句柄相關函數,如DuplicateHandle或CloseHandle,但這是不允許的。如果文檔調用某個ID,然後將其稱爲ID。 – 2010-01-18 20:18:01