問題タブ [usleep]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
752 参照

c - ncursesで2つのものを同時に印刷する方法

スペースインベーダーに似た ncurses でゲームを作っています。

これまでのところ、動きと撃墜はありましたが、問題が発生しました。

プレイヤーがレーザーを発射するとき、画面の一方の端からもう一方の端にレーザーが表示されないように、usleep 呼び出しを使用して、レーザーが画面上を移動するのを遅らせています。

usleep を使用してレーザーを遅延させる問題は、レーザーが画面を横切って移動している間、ループが終了するまでプレーヤーが移動できないことを意味します。

私の質問は、ユーザー入力でプレーヤー/カーソルを同時に動かしながら、画面上を移動するレーザーを印刷する別の方法はありますか?

ユーザーが「f」キーを押すと、次のコードは画面上で線 (レーザー) を移動します。ただし、レーザーが画面から離れるまで、ユーザーは再び移動することはできません。

0 投票する
1 に答える
175 参照

c++ - C++ では Usleep の開始が早すぎる

C++ ではusleep、「メイン」パスで使用し、out前に関数を呼び出します。

out画面に何かを印刷するだけです。残念ながら、コマンドは sleep コマンドの前ですが、画面に表示されるのは 4 秒後です。それはどうしてですか?

0 投票する
2 に答える
211 参照

c++ - C ++で非同期IOを使用しているため、スリープせずにプログラムを遅延させる別の方法は?

スリープする以外に C++ でプログラムを遅延させる別の方法について質問があります。

UDP パケットを受信して​​コントローラーに送信するプログラムの一部があります。プログラムのこの部分は、非同期で実行する必要があります。このプロバイダーのオーバーヘッドを削減するために、別のスレッドでソケットを監視するのではなく、非同期 IO を使用して UDP パケットを受信することにしました。

これを達成するために、この sigaction の例に従いました。この sigaction がアクティブなときに usleep を使用しようとすると、パケットを受信するたびにスリープが中断されることに気付きました。CPUのスリープを停止する可能性のあるCPU上の何らかの割り込みによってsigactionがトリガーされると想定しているため、この種のことは理にかなっています。なぜこれが起こるのかについて誰かが良い説明を持っているなら、私は知りたいです. 私の問題は、複数のパケットを連続して送信する必要があり、それらを遅延させる必要がある場合があることです。そうしないと、コントローラーがパケットを見逃してしまいます。

私は通常、スリープを使用してパケットの送信を遅らせますが、現在は、sigaction によって壊れているため、できません。ビジーウェイトを使用することも考えましたが、一貫性がなさすぎる可能性があります。タイマーを使用して定期的に空になるパケットのキューを使用することも考えていますが、もっと簡単な解決策があるようです。

スリープ以外にパケットの送信を遅らせる別の方法はありますか? スリープを中断しないように非同期 IO を設定する方法はありますか? 私はこれについて間違った方法で行っていますか?

0 投票する
2 に答える
252 参照

perl - 非常に高速にループする単純な Perl スクリプト

perl スクリプトを非常に高速にループさせようとしています (Solaris で)。

私はこのようなものを持っています:

perl スクリプトが 10 マイクロ秒ごとにシェル スクリプトを実行するようにします。スクリプトは失敗しませんが、スクリプト内で usleep の精度をどれだけ変更しても、スクリプトは 1 秒あたり約 10 回しか実行されません。それよりもはるかに速くループする必要があります。

ここで何か基本的なことが欠けていますか? これまで perl を使用したことはありませんが、Solaris では必要なスリープ速度が得られないため、perl を選択しました。

ティア

ハスキー。

編集:

ユーザーのコメントのおかげでスクリプトのアイデアが改訂されました - 私は今、すべてを perl 内で実行しようとしていますが、惨めに失敗しています! 基本的に、プロセスをキャプチャするために PS コマンドを実行しようとしています。プロセスが存在する場合は、行をキャプチャしてテキスト ファイルに出力します。

これにより、次のエラーが返されます。

0 投票する
1 に答える
1077 参照

c - pthread 関数 usleep() の for ループでランダム シード ジェネレーターを使用するにはどうすればよいですか?

usleep() のランダム シード ジェネレータとして使用するために、thread_mutex 初期化関数に渡す番号が与えられることになっています。乱数のシードを作成する意味がわかりません。srand() を使用するときに遭遇する問題は、次のコードsrand(timeDelay)を for ループに入れると、rand() が常に同じになることです。直接の指示には次のように書かれています:

コード

「ランダム シード」を生成するinit レーサーのコード

run関数のコード

0 投票する
1 に答える
471 参照

grand-central-dispatch - OSX 10.10 でのコード実行の遅延

OSX 10.10 システムでのみ実行しているコードに影響する非常に奇妙な問題に遭遇しました。私のコードを実行している 25 以上の OSX 10.10 システムでこの異常が発生するのを見てきましたが、アップグレード (10.7) する前はまったく同じコードでこの動作は見られませんでした。さらに、この問題は 0 ~ 5% の確率でランダムに発生するため、100% 再現可能ではありません。コードをテストしている間、マシン上で他に重要なことや CPU を消耗させることは何も起きていません。何か他のことが起こっていたとしても、私が経験している遅延が途方もなく長いというまさにその事実は、その結論が疑わしいように思われる. とにかく、これ以上苦労することなく、次の NSLog プリントを見てください。

時間はナノ秒単位です。NSLog タイムスタンプによると、実際には、必要な 0.679 秒ではなく、20.68 秒待機することになりました。それでは、コードを見てみましょう。

mach_wait が何であるか疑問に思っている場合のために説明すると、これはデフォルトで使用可能な高解像度タイマーです。含めるだけ

しかし、 mach_wait_until を次のように置き換えた場合、まったく同じ問題が発生したため、それは問題ではありません。

  • sleep()
  • usleep()
  • [NSThread sleepForTimeInterval:]
  • GCD's dispatch_after(,^{});
  • mach_wait_until()

どのような遅延方法を使用しようNSLogとしても、正しいミリ秒数であることを確認するためのサニティ チェックとして「遅延」値をコンソールに出力してから、上記のいずれかを実行します。約 95% の確率で、仕様に従って動作します。しかし、時折ランダムに、10 秒から 20 秒のような遅延が発生します。何を与える?これは Yosemite カーネルの問題ですか? 繰り返しますが、10.7 で実行されている同じコードでこれを経験したことはありません。そして、コードの実行を遅らせるために上記のすべての方法をテストしました。


アップデート:

コメントのアドバイスに従って、私は先に進みましたsudo dtruss -f -e sudo -u USER MyApp 2> ~/myapps.log. いつものように、ほとんどの mach_wait と sleep は想定どおりに動作しました。そのため、識別しやすくするために、実際の睡眠時間が本来の 3 倍を超える場合に DELAY ISSUE を出力するチェックを追加しました。私のプログラムを実行し、遅延の問題を検索しました。以下にリストされているのは、mach_wait ステートメントの直前と直後のログ出力の間に発生する最も頻繁なシステム コール (dtruss 出力) です。

  • 99613/0xcf33b9: 30250 __semwait_signal(0xD07, 0x0, 0x1) = -1 Err#60
  • 99613/0xcf33b9: 16 workq_kernreturn(0x20, 0x0, 0x1) = 0 0

上記の 2 つの呼び出しが約 250 以上あります。おそらく、__semwait よりも少し作業量が多くなります。通常、semwait のすべてが完了するまでに約 30000 '単位' の時間がかかります。どのように dtruss 時間かわかりません。これらが通話の大部分を占めています。

  • 752/0xcf3320: 2787191 kevent64 (0x3、0x0、0x0) = 1 0
  • 752/0xcf335d: 189948 選択 (0x40、0x7FC080E18220、0x7FC080E13B40、0x0、0x0) = 1 0
  • 752/0xcf335d: 1648403 選択 (0x40、0x7FC080E18220、0x7FC080E13B40、0x0、0x0) = 1 0

これら 3 つのシステム コールは、時間の単位数が最も長くかかりました。そして、それらはそれぞれ、約 20 秒の待機ギャップ中に出力に 1 回表示されました。

上記の =X をどうするかわからない