TCP接続を介してProPresenter(別のプログラム)からデータを継続的に受信するOBS用のLuaスクリプトを書いています。LuaSocketライブラリを使用して接続し、期待どおりにデータを取得します。
問題は、ProPresenterを閉じると、luasocketタイムアウトを0に設定しているときに接続が閉じられたことをスクリプトに登録できないことです(非ブロッキング接続にするため)。スクリプトを常にノンブロッキングにする必要があります。そうしないと、すべてのOBSが停止し、フレームレートが1を下回ります...
ただし、タイムアウトをたとえばに設定した場合。1秒後、luasocketは接続が問題なく閉じられたことを登録します。この例によれば、タイムアウトが0の場合にも機能するはずです。しかし、明らかにそうではなく、例ではLuasocketの古いバージョンを使用しており、最新バージョンが変更されている可能性があるためだと思います。
これが私のコードです:
接続がタイムアウトするためにデュオを閉じたことを登録しません:
function recv_and_process_data()
local data
data, err, partial = s:receive()
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--doesn't get here because of timeout...
--inform script that the connection has closed
elseif err == "timeout" then
--goes here as soon as ProPresenter is closed
print(err .. " partial: " .. partial)
end
end
接続が閉じたときに登録しますが、OBSをストールさせます。
function recv_and_process_data()
local data
s:settimeout(1) --timeout set to 1 second
data, err, partial = s:receive()
s:settimeout(0)
if data ~= nil then
--process the recieved data. This part works.
elseif err == "closed" then
--goes here when ProPresenter is closed
--inform script that the connection has closed
elseif err == "timeout" then
print(err .. " partial: " .. partial)
end
end
function recv_and_process_data()
local data
data, err, partial = s:receive(0)
if err == "closed" then
print(err .. " partial: " .. partial)
end
end
これを機能させることができない場合は、ProPresentersサーバーがまだ実行されているかどうかを確認するために再接続を試みる必要があると思います。
私もこの問題を理解しようとしていました。非常に小さいsettimeout()値でも、使用できるエラーが返されますが、プログラムはまったく保持されないことがわかりました。
私が使う local Data, Error = Client:settimeout(0.0001)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加