2

私はlua-users Sleep Functionリファレンスを調べて、スリープの問題に対する非ビジー待機ソリューションを見つけようとしましたが、それらのどれにも満足していません。それにもかかわらず、テールコールを使用する関数の最後に遅延を提供するためにいくつかを使用しようとしました。

通常、私は末尾呼び出しを使用しませんが、lua は末尾呼び出しのためにスタックを残さないので、私には適しています。

残念ながら、プロセッサの使用率が約 20% に急上昇し、プログラムが開始されるとすぐに応答しなくなり、出力がフラッシュされることはありません。

問題 (簡略化) は次のようになります。

function myFunc ()
   -- do some stuff
   -- lots of snazzy logic and function calls
   -- heck, throw in a few prints
   print "Going to sleep"
   -- sleep for a bit
   os.execute("sleep 10")
   print "Waking up"
   -- tail call
   return myFunc()
end

ソケット選択メソッド、os.execute、そしてもちろんビジー待機を試しました。これらのうち、ビジーな待機のみが期待される動作を提供します。

これらの他の非ビジー待機ソリューションも非ブロックですか? つまり、遅延にもかかわらずテール コールの処理が許可されますか?

出力をフラッシュし、ビジー待機なしで再開する前に関数を 10 秒待機させるにはどうすればよいですか?

4

1 に答える 1

0

Nick Gammon のアドバイスで、彼の wait.lua ソリューションを試してみました。私の最初の試み:

function controlLoop()
   wait.make (
      function()
         world.Note("Hello world.") -- essentially print
        wait.time(10)
     end
   )
   world.Note("Goodbye world.") -- essentially print
  return controlLoop()
end

まったく同じ 100% の CPU 使用率に悩まされ、出力が表示されません。

私の2回目の試み:

function controlLoop()
   wait.make (
      function()
         world.Note("Hello world.")
         wait.time(10)
         world.Note("Goodbye world.")
         return controlLoop()
      end
   )
end

3 時間問題なく動作しています。を使用してスタック トレースにデバッグ呼び出しを行いましたdebug.traceback()が、1 レベル以上の深さの応答が得られませんでした。さらに、プロセスのウィンドウ メモリ使用量を監視すると、3 時間以上増加しませんでした。

解決策が見つかったことをうれしく思いますが、なぜそれが機能しているのか、元のバージョンが失敗したのかを理解できないことに、まだ少し不満を感じています。

私は視野狭窄に苦しんでおり、while ループが私の問題を有名に解決してくれると指摘されました。

function controlLoop()
   wait.make (
      function()
         while true do
            world.Note("Hello world.")
            wait.time(10)
            world.Note("Goodbye world.")
         end -- loop
      end
   )
end

私は返信することしかできません...当然です。

于 2015-10-17T21:13:19.487 に答える