的read()操作取消線程,我用連接到串口的設備進行通信。現在,我正在等待串行設備發送某些字節的特定消息。對於讀取操作(以及收到所需消息後的反應),我創建了一個新線程。根據用戶請求,我希望能夠取消該線程。在我的Cocoa項目中用串口
正如蘋果在docs中建議的那樣,我在線程字典中添加了一個標誌,定期檢查標誌是否已設置,如果是,請致電[NSThread exit]
。這工作正常。現在
,線可能會被卡住等待串行設備到最後發送12字節的消息。讀取調用看起來是這樣的:
numBytes = read(fileDescriptor, buffer, 12);
一旦線程開始讀設備,但沒有數據進來,我可以設置標誌告訴線程結束,但線程不會閱讀標誌,除非它最終收到至少12個字節的數據並繼續處理。
有沒有辦法殺死當前在串口設備上執行讀操作的線程?
編輯澄清: 我不創造與串行設備的I/O操作一個單獨的線程堅持。如果有一種方法可以封裝操作,以便我可以在用戶按下取消按鈕時「殺死」它們,我非常高興。 我正在爲桌面Mac OS X開發Cocoa應用程序,因此不會對移動設備及其功能施加任何限制。 解決方法是,如果沒有要讀取的字節,則立即返回讀取函數。我怎樣才能做到這一點?
這是一個非常糟糕的做法。你永遠不應該編寫經常喚醒並輪詢變量的應用程序。這破壞了電池的使用壽命,聽起來像OP正在爲移動設備編寫這個文件,這是一個大問題......您可以通過在您的'select' /'poll'中添加一個管道來消除超時/喚醒,調用,並通過管道發送中止請求。 –
我正在開發桌面Mac OS X,因此沒有移動設備的限制。 –