LUA は初めてで、Corona SDK を使用して LUA で tcp メッセージング ライブラリを作成しています。コルーチンで実行されている場合でも、ソケット読み取り操作がアプリケーション UI をハングさせるという問題がありました。
コルーチンの開始方法:
function Messaging:readLoop()
self.readCoroutine = coroutine.create(function() self:blockingLoop() end)
coroutine.resume(self.readCoroutine)
end
ブロッキング ループ:
function Messaging:blockingLoop()
line,err,rest = self.sock:receive(BUFSIZE) -- <= Hangs UI if there is no incoming data
end
もちろん、コルーチンがスレッドと同等ではないことは知っていますが、LUA インタープリターがブロッキング操作で別のコルーチンに切り替わることを期待していました (GIL を使用した Python スレッドのように)。UIをブロックせずにソケットから読み取る可能性はありますか? たとえば、実際のスレッド化または非同期アプローチでは? ありがとう。
PS BUFSIZ を排除することはオプションではありません。0.2..0.4 秒でも UI をまったくブロックしたくないからです (モバイル ネットワークの遅延が遅い)。