問題タブ [interruption]

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 投票する
1 に答える
1758 参照

exception - Haskell での UserInterrupt 例外の処理

私は Haskell でスキーム インタープリター用の REPL を実装しています。UserInterrupt、StackOverflow、HeapOverflow などの非同期イベントを処理したいと考えています。基本的には、UserInterrupt が発生したときに現在の計算を停止して、 StackOverflow と HeapOverflow が発生したときの適切なメッセージなど。これを次のように実装しました。

1 つの例外を除いて、期待どおりに動作します。インタープリターを起動して Ctrl-Z + Enter を押すと、次のようになります。

そのとおりです。しかし、インタープリターを起動して Ctrl-C を押してから Ctrl-Z + Enter を押すと、次のようになります。

そして、ハングして、インタープリターを使用できなくなりました。ただし、もう一度 Ctrl-C を押すと、REPL のブロックが解除されます。いろいろ調べたのですが、原因がわかりません。誰でも説明できますか?

どうもありがとう!

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

.net - FileStream.BeginRead によって開始された非同期読み取り操作をエラーなしで早期に終了させることは可能ですか?

まず、EndRead のドキュメントでは、BeginReadによって開始された非同期読み取り操作がアトミックまたは中断不可能であると明示的に述べていません。

質問

FileStream.BeginRead によって開始された非同期読み取り操作を中断して、バッファがいっぱいになる前に終了し、これまでにバッファに読み取られたバイト数を返すことは可能ですか?

つまり、「Cancel_IO」のような呼び出し可能なメソッドがあり、EndRead を呼び出すと、可能なすべてのバイトが読み取られるのを待つのではなく、読み取りがキャンセルされた結果として早く返されますか?

バックグラウンド

FileStream、BeginRead、および EndRead のドキュメントを読みました。EndRead には、部分的にいっぱいのバッファーを返し、操作の早期完了をトリガーできるオーバーロードはありません。FileStream.BeginRead によって開始された操作が EndRead のときに早期に終了する可能性がある、Windows オペレーティング システムの API (Win32) またはディスク ドライバー API のメソッドの存在を誰かが確認または拒否できるかどうかに興味があります。呼ばれた。「早期」とは、要求されたバッファー長全体をエラーなしで満たす前を意味します。

使用事例

想像を絶するために、ファイルがネットワーク共有上にあり、ネットワークが極端な速度低下を経験する場合があると仮定すると、一般的な 1MB バッファリング操作の早期完了をトリガーすることが実用的かつ最適です。新しい 1MB バッファリング操作を再開する前に処理するための数バイト。

これらの「数バイト」を使用して、計算集約型の多数のメモリ内リソースの構築を開始できます。これらのリソースは、バッファリングの終了が許可されている間に構築できます。

ドキュメントについて

BeginRead のドキュメントでは、非同期操作がアトミックである、または中断できないことを明示的に述べていないことに注意してください。言及されているのは、「エラー」が発生した場合、EndRead が呼び出されるまでそれについてわからないということだけです。これは、EndRead が要求された数よりも少ないバイト数を返す原因となる、エラーではない他のイベントが発生する可能性を排除するものではありません。

たとえば、「ファイルの終わり」と「バッファがいっぱい」は、非同期読み取り操作の 2 つの「自然な」中断と見なすことができ、エラーなしで、要求されたバイト数よりも少ない数を返します。「人為的な」割り込みの可能性を探しています。これにより、EOF の前でバッファーがいっぱいになる前に、EndRead がバッファーに読み込まれたバイト数を正常に返すことにもなります。

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

ios - IOS オーディオの中断

Matt の古い AudioStreamer を使用してオーディオ ストリーミング アプリを開発しています。

私の問題は、[self playpause] で関数「playpause」を呼び出そうとしていることです。しかし、エラー playpause undeclared が発生します!

MyAudioSessionInterruptionListener 内で playpause を宣言するにはどうすればよいですか?

0 投票する
6 に答える
5864 参照

iphone - 中断後に AudioSessionSetActive が失敗する

私は何週間も実際に何が起こっているのかを理解しようとしていましたが、中断後に再生を続行できない理由がわからないので、おそらく答えを知っているでしょう. AudioSessionSetActive(TRUE) は、アプリがバックグラウンドで再生され、別のアプリにいる場合、再アクティブ化中に kAudioSessionIncompatibleCategory である '!cat' を常に返します。アプリの使用中に中断が発生した場合でも、問題なく動作し、再生を続けます。

元のコードには、実際にはすべての AudioSession および AudioQueue 呼び出しが、エラーを意味する場合に OSStatus を出力するマクロでラップされていますが、読みやすくするために削除しました。また、[セルフポーズ]は一時停止を切り替えるだけなので、基本的には休止時に AudioQueueStart(audioQueue, NULL) を呼び出しますが、AudioSessionが失敗した場合はもちろん機能しません。

オーディオ セッションの初期化コード:

割り込みハンドラ コード:

このストリーマーのソース コードは、 https://bitbucket.org/and/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.mで見つけることができます。

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

iphone - 中断が発生したときにオーディオ アプリをバックグラウンドでアクティブにしておくにはどうすればよいですか?

AVAudioSession と AVAudioPlayer およびオーディオ バックグラウンド モードを使用して、アプリをバックグラウンドでアクティブにしようとしています。割り込みが来なければ正常に動作します。しかし、audioPlayerBeginInterruption メッセージを受信すると、backgroundTask を起動し、audioPlayerEndInterruption メッセージを待ってから、オーディオ セッションを再起動します。

(私は、audioPlayerBeginInterruption アプリがまだアクティブな後、プレーヤーが一時停止していることに気付きましたが、audioPlayerEndInterruption アプリが中断された後)

問題 1 : audioPlayerEndInterruption メッセージが 10 分後に到着した場合、バックグラウンド タスクが強制終了され、アプリケーションが中断され、オーディオ セッションを再開できません

問題 2 : いくつかのアプリ/ゲームで、audioPlayerBeginInterruption メッセージを受け取りましたが、audioPlayerEndInterruption を受け取りませんでした。

アプリケーションを常にアクティブにするにはどうすればよいですか?

すべての回答とアドバイスに感謝します

0 投票する
0 に答える
167 参照

iphone - iPhone アプリの中断がアプリに正しく報告されない

これはごくまれな使用例ですが、良い疑問を投げかけます。どうぞ:

中断が発生したときにゲームを一時停止する必要がある iPhone 用のゲームを開発しています。割り込みハンドラーを使用してapplicationWillResignActive: applicationDidEnterBackground: applicationWillEnterForeground:applicationDidBecomeActive:ゲームの一時停止と再開、ゲームの進行状況の保存などを期待どおりに行います。

次のシナリオで問題が発生しています。

  1. ゲームが実行されており、マルチタスクの割り込みを行います (ホーム ボタンをダブルクリックします)。
  2. applicationWillResignActive:が呼び出され、ゲームが中断され、すべてが素晴らしいです。
  3. 次に、マルチタスキング バーを開いた状態で、トリプル ホーム クリック割り込みを行います ([設定] -> [一般] -> [アクセシビリティ] -> [トリプル ホーム クリック] を参照し、[確認] オプションを選択します)。オプション ポップアップがマルチタスク バーの上部にスライドして表示され、アプリで割り込みハンドラーが呼び出されません。
  4. オプションのポップアップをキャンセルします。 applicationDidBecomeActive:が呼び出されると、マルチタスク バーがまだ開いている間にゲームが再開されます。変ですね。
  5. ホームボタンをもう一度ダブルクリックしてマルチタスクバーを閉じますが、割り込みハンドラーは呼び出されません。

ここでサムヒルで何が起こっているのですか??? この同じ一連の中断を正しく処理しているように見える他のゲーム (たとえば、Spy Mouse など) を見たことがあります。OS からシステム イベントをキャッチする別の方法があり、それによって中断をより正確に処理できるかどうかを知っている人はいますか? それ、または明らかな何かが欠けていますか?

どんな助けや洞察も大歓迎です。前もって感謝します!

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

java - Mac OS 10.7 Lion での Eclipse の中断

少し前に Mac OS 10.7 Lion にアップグレードしました。Eclipse (Web 開発者向けの Eclipse Java EE IDE、バージョン: Helios Service Release 2) は問題なく動作しますが、次の 2 つのことが非常に遅くなります。

  • 新しいプロジェクトの作成には、以前は数秒かかっていましたが、現在は約 1.5 分かかります。
  • 時々、クラスを保存するとすべてが停止し、回転する待機カーソルが約 1 分間表示されます。アクティビティ モニターは、その間 Eclipse に「応答していません」というラベルを付けます。

最新の Eclipse アップデートがあります。この動作の原因を知っている人はいますか?

ありがとう、マイク

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

delphi - Delphi で検索ダイアログを中断するにはどうすればよいですか?

標準の検索ダイアログがあります。

ここに画像の説明を入力

私のプログラムはいくつかの非常に大きなファイルを処理でき、そのようなファイル内のテキストを見つけるのに 10 秒または 20 秒以上かかる場合があります。「次を検索」ボタンを押した後、カーソルを砂時計に変更します。テキストが見つかったか見つからなかったら、標準のポインターに戻します。

私の問題は、ユーザーが検索をキャンセルすることを決定し、[キャンセル] ボタンを押して実行することを決定する可能性があることです。[キャンセル] ボタンをクリックするとダイアログが閉じますが、テキストが見つかるか見つからないまで、FindDialogFind ルーチン内で検索が続行されます。

FindDialog.exe の終了時にブレークポイントを設定しましたが、FindDialogFind が完了するまで到達しません。

FindDialogFind ループを中断できるようにする [キャンセル] ボタンが押されたという事実をキャプチャする方法はありますか、または [キャンセル] ボタンが押されたときに検索を停止するより良い方法がありますか?

0 投票する
4 に答える
1324 参照

exception - OS 開発: 例外ルーチンの後の無限ループを回避する方法

数か月間、私は「自作」のオペレーティング システムに取り組んできました。現在、起動して 32 ビット保護モードに入ります。割り込みテーブルをロードしましたが、ページネーションを設定していません (まだ)。

例外ルーチンを作成しているときに、命令が例外をスローすると、例外ルーチンが実行されますが、CPU は例外をスローした命令にジャンプして戻ることに気付きました。これはすべての例外に適用されるわけではありません (たとえば、div by zero 例外は、除算命令の後に命令に戻ります)、次の一般的な保護例外を考えてみましょう。

私のルーチンは単純です。赤いエラー メッセージを表示する関数を呼び出します。

結果: MOV CS、EAX が失敗します -> エラー メッセージが表示されます -> CPU が MOV CS に戻ります -> エラー メッセージをスパムする無限ループ。

この問題について、オペレーティング システムと UNIX セキュリティの教師と話しました。彼は、Linux にはそれを回避する方法があることは知っているが、どの方法があるかはわからないと私に言いました。

単純な解決策は、その命令の長さを取得するために、ルーチン内からスロー命令を解析することです。その解決策はかなり複雑で、影響を受けるすべての例外ルーチンで比較的重い関数への呼び出しを追加するのは少し不快に感じます...

したがって、問題を回避する別の方法があるかどうか疑問に思っていました。この動作を変更できるビットを含む「魔法の」レジスタがあるのではないでしょうか?

--

提案/情報をお寄せいただきありがとうございます。

--

編集:なぜ問題のある命令をスキップして通常の実行を再開したいのか疑問に思う人が多いようです。

これには 2 つの理由があります。

  1. まず第一に、プロセスを強制終了することは可能な解決策ですが、クリーンな解決策ではありません。これは、Linux で行われる方法ではありません。たとえば、(AFAIK) カーネルがシグナル (SIGSEGV だと思います) を送信しますが、すぐに実行を中断しません。アプリケーションはシグナルをブロックまたは無視して、独自の実行を再開できるため、これは理にかなっています。これは、何か間違った IMO を実行したことをアプリケーションに伝える非常にエレガントな方法です。

  2. 別の理由: カーネル自体が不正な操作を実行した場合はどうなるでしょうか? バグが原因である可能性がありますが、カーネル拡張が原因である可能性もあります。コメントで述べたように、その場合はどうすればよいですか? カーネルを強制終了して、スマイリー付きの素敵なブルー スクリーンを表示しますか?

だからこそ、命令を飛び越えられるようになりたい。命令のサイズを「推測」することは明らかにオプションではなく、命令の解析はかなり複雑に思えます (そのようなルーチンの実装を気にしているわけではありませんが、より良い方法がないことを確認する必要があります)。