我使用自定義同步原語的Windows鍵的事件,通過http://locklessinc.com/articles/keyed_events/
啓發,支持線程中斷,我已經改變地方都阻塞調用像睡眠或WaitForSingleObject的使用他們的警惕性版本一樣SleepEx和WaitForSingleObjectEx。然後我可以通過QueueUserAPC排隊一個APC來中斷等待,並且如果返回值是WAIT_IO_COMPLETION,我會拋出一個特殊的異常,它會導致所有析構函數被調用,然後線程退出。這與pthread_cancel()的Linux版本類似,這會導致堆棧放開,因此線程退出時會清理內容。
我看到NtWaitForKeyedEvent()也有一個Alertable參數,所以我想知道是否可以對這種情況做同樣的事情,或者有警告?如果APC會喚醒它,我也不知道要查找什麼返回值,因爲NTSTATUS不直接對應於WIN32返回碼。有一個STATUS_USER_APC和一個STATUS_ALERTED,我不知道它是否會是這兩者之一。如果用戶APC功能不足以提醒鍵控事件等待,那是什麼?NtWaitForKeyedEvent可提醒嗎?
2
A
回答
1
NtWaitForKeyedEvent
Altertable = TRUE確實看起來像它會做你想做的。這是您用NtWaitForSingleObject
設置的參數以啓用APC的收集。
如果由於正在運行APC而等待完成,您將接收到STATUS_USER_APC
;如果NtAlertThread
與您的線程有關,則將調用STATUS_ALERTED
。如果你想要的只是一個信號來阻止等待,那麼NtAlertThread
就足夠了。
如果你的異常處理機制沒有SEH展開,你可能直接從APC例程拋出特殊的異常。
相關問題
- 1. 提醒
- 2. 如何提醒瀏覽器從javaclass?可能嗎?
- 3. 我可以提醒我所有的元素嗎?
- 4. MDM可以在iOS中發送提醒和聲音通知嗎?
- 5. 圖片鏈接CakePHP中的$ confirmMessage提醒HTMLhelper - 可能嗎?
- 6. 我可以提醒jsp中的struts2屬性標記嗎?
- 7. 使自定義Android提醒提醒
- 8. 聊天消息提醒,如Gmail提醒
- 9. 我可以「強制」線程喚醒嗎?
- 10. EventKit提醒
- 11. 如何提醒
- 12. android提醒
- 13. 生日提醒
- 14. 提醒iOS swift
- 15. 刪除提醒
- 16. 提醒在GWT
- 17. ics提醒?
- 18. MySQL的提醒
- 19. AlertDialog&SnackBar提醒
- 20. 如何提醒
- 21. Android提醒!
- 22. JQuery提醒
- 23. JavaScript的:如何在window.opener提醒可變
- 24. 可以提醒更新爲Windows手機
- 25. jquery可排序提醒此列表ID
- 26. 我如何可以提醒使用javascript
- 27. iOS提醒應用程序可以根據特定日期設置提醒
- 28. Apple提供用於編輯/添加提醒的UI嗎?
- 29. 如何提示提醒?
- 30. 提醒和提示javascript
這似乎工作得很好。我使用APC,因爲它允許我執行一些標誌的設置,以便檢查取消是否是用戶請求的。我不太確定的一件事是在等待中斷但警報不同的情況下該怎麼做。我認爲正確的做法是恢復等待(如果正在使用超時,則適當調整超時),但如果有機會錯過NtReleaseKeyedEvent(),這可能是一個問題。鍵控事件API是否以某種方式處理警報的這一方面? –