應該KillTimer是否被指定的計時器的相同進程調用?KillTimer - 無意中銷燬另一個進程的計時器
0
A
回答
3
是的,KillTimer
應該被調用與調用SetTimer
的過程相同的過程。但是,儘管文檔清楚地表明調用線程在調用SetTimer
時需要擁有該窗口,但似乎並沒有針對KillTimer
執行相同的實施。它甚至沒有說殺手必須是相同的過程,更不用說同一個線程。因此,什麼應該發生和什麼必須發生是兩件不同的事情。
Raymond Chen wrote in his blog in 2012 about killing timers,並且在評論中有幾條聲明說定時器只能從原始進程中被殺死。這些言論沒有受到質疑,但事實證明很容易通過實驗反駁它們。
以下命令行程序顯示可以從其他進程中終止計時器。在沒有參數的情況下運行一次,它會創建一個計時器並開始使用計時器ID打印消息。將該ID傳遞給程序的第二次調用,並且第二個實例將終止第一個實例的計時器。它會報告成功,並且第一個實例將停止打印消息(因爲它不再接收定時器消息)。
#include <iostream>
#include <sstream>
#include <windows.h>
int main(int argc, char* argv[])
{
if (argc > 1) {
std::istringstream in(argv[1]);
UINT timerid;
in >> timerid;
if (!KillTimer(NULL, timerid)) {
DWORD err = GetLastError();
std::cout << "KillTimer error (" << err << ")" << std::endl;
}
else {
std::cout << "KillTimer success" << std::endl;
}
} else {
UINT timerid = SetTimer(NULL, 0, 1000, NULL);
std::cout << "Get timer ID " << timerid << std::endl;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (msg.message == WM_TIMER) {
std::cout << "Got WM_TIMER " << msg.wParam << std::endl;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
(進程是在64位的Windows 7虛擬機,使用Visual Studio 2015年編譯運行32位,因爲這是我在其他任何語言等效代碼應該很容易複製。)
相關問題
- 1. 在java中銷燬進程
- 2. 銷燬一個wcf線程
- 3. com.android.camera進程不被銷燬
- 4. 銷燬LinearLayout中一個按鈕的另一個按鈕
- 5. 在另一個應用程序中銷燬會話變量
- 6. KillTimer是否必要?
- 7. 如何在java中銷燬進程
- 8. 當我的應用程序暫停/殺死/銷燬時,倒計時器是否停止/銷燬?
- 9. 當另一個活動停止時銷燬活動
- 10. 銷燬Java中的線程
- 11. 如何銷燬一個線程?
- 12. 何時一個servlet被銷燬?
- 13. 如何銷燬從java中的進程生成器生成的進程
- 14. 銷燬一個元素會銷燬該元素上的綁定?
- 15. 線程被銷燬時,變量是否被銷燬?
- 16. 無法銷燬PouchDB
- 17. 在倒計時計時器中啓動另一個計時器
- 18. 從另一個應用程序中銷燬活動或應用程序本身
- 19. Android銷燬活動,查殺進程
- 20. Grails在8080上銷燬現有進程
- 21. 線程的自毀計時器?
- 22. 銷燬迭代器
- 23. 銷燬會話,Rails設計
- 24. HistoryRecord銷燬超時
- 25. 如何銷燬Android活動被破壞時的本機進程
- 26. 主機進程終止時的CUDA上下文銷燬
- 27. 在計時器執行過程中使用C++ KillTimer()是否安全?
- 28. 在Wiengine中銷燬其一個圖層
- 29. 當一個對象進入網格時銷燬網格中的圖像對象
- 30. Php:開始會話在一個API中,並在另一個API中銷燬
@ USER1 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644903%28v=vs.85%29.aspx沒有關於銷燬另一個進程的計時器。 – RepeatUntil
'SetTimer'文檔很清楚'hWnd'必須屬於調用線程。 'KillTimer'似乎很可能會有相同的限制。 –
我不太確定在這種情況下「無意中」這個詞應該是什麼意思。你是否在「意外」殺死計時器? –