我想弄清楚如何使用協程(在Lua中)處理事件。我看到一種常見的做法似乎是創建包裝函數,它產生當前的協同程序,然後在等待的東西出現時恢復它。這似乎是一個很好的解決方案,但這些問題呢? :什麼是使用協程進行事件處理的正確方法?
你如何等待多個事件在同一時間,分支取決於哪一個先來?還是應該重新設計程序以避免這種情況?
如何取消一段時間後的等待?事件循環可以在其套接字發送/接收包裝中有超時參數,但是自定義事件呢?
如何觸發協程從外部改變其狀態?例如,我想要一個被調用的函數,會導致協程跳轉到不同的步驟,或者開始等待不同的事件。
編輯:
目前我有,我註冊一個協程與事件的系統和協程獲取與每次事件發生時的事件名稱和信息作爲參數恢復。在這個系統中,1和2不是問題,3可以通過使coro期望一個特殊的事件名稱來使其跳轉到不同的步驟,並以該名稱作爲arg來恢復。自定義對象也可以有方法以相同的方式註冊事件處理程序。
我只是想知道這是否被認爲是使用協程進行事件處理的正確方法。例如,如果我有讀取事件和計時器事件(作爲讀取超時),並且首先發生讀取事件,則必須手動取消計時器。它似乎不適合順序特性或與協程一起處理事件。
「我只是想知道這是否被認爲是使用協程進行事件處理的正確方法。」如果它適合你,那麼這是正確的方式。爲什麼你會使用一個計時器事件來暫停另一個事件?簡單地在您的事件系統中內置超時是否更有意義? – 2012-07-24 18:57:24
「如果它對你有用,那麼它是正確的方式」它工作正常(但不是很好),我認爲可能有更好的方法,但我錯過了它,因爲我不是非常與協程的家族。 「你爲什麼要使用計時器事件來暫停另一個事件?」。我可以,但自定義事件源將都必須實現超時。也許我可以通過添加一個系統來使用主事件循環註冊自定義事件源來解決這個問題?最後,也許我應該讓處理程序在第一次觸發時自動刪除? – mtk358 2012-07-24 19:22:34