問題タブ [runloop]
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.
macos - CFRunLoopRemoveSource と CFRunLoopSourceInvalidate の違い
Mac で HID ドライバー コードのクラッシュをデバッグしていたところ、CFRunLoop でクラッシュが発生していることがわかりました。ドライバー コードでは、HID デバイスに一致する VID と PID に一致するデバイスの USB ハンドルを開き、setInterruptReportHandlerCallback 関数を使用して割り込みコールバックを設定し、CFRunLoopAddSource 呼び出しを使用して CFRunLoop に追加します。クローズ ハンドルの呼び出しでは、CFRunLoopRemoveSource を使用して解放し、次に CFRunLoopSourceRef で CFRelease を使用しました。
この問題は、ハンドルを開こうとしてしばらく (5ms) 待ってから、ループでハンドルを閉じようとすると発生します。
私が問題を検索したとき、彼らが私と同様の問題を抱えていたリンクに出くわしましたhttp://lists.apple.com/archives/usb/.../msg00099.htmlここで、削除の代わりに CFRunLoopSourceInvalidate 呼び出しを使用していましたソース呼び出し。close handles 呼び出しで Invalidate source に変更すると、クラッシュが修正されました。クラッシュの違いと、この呼び出しでクラッシュが修正された理由を知りたいですか?
ありがとうjbsp72
cocoa - Cocoa アプリケーションにはメインループがありますか?
X11 で GTK+ を使用する Linux では、「メイン ループ」と呼ばれるものがあります。メイン ループを開始すると、アプリケーションのメイン スレッドで実行されるタイマーが作成されます。そのタイマーをコールバック関数に設定すると、非常に優れたアプリケーション全体のタイマーが得られます。
これはそのためのサンプルコードです:
Mac OS X 用の同様のアプリケーションを作成しようとしていますが、メイン ループの代わりに単純なタイマーを使用しています。
それはあまりうまくいかないようです。タイマーは常にオフに設定されています。NSTimer でも試してみましたが、うまくいきませんでした。私はobjective-c、特にGUIアプリケーションにはあまり詳しくありません。
とにかく、Cocoa (Xcode を使用した object-c) でアプリケーション全体のタイマーを実装する方法はありますか?
ありがとう!
編集 NSTimer を使用する場合、これは実行時に発生するエラーです。
編集2
はい、分かりました。問題は、タイマーに「target:」を追加しなかったことです。今、タイマーをオフにすると、次のエラーが表示されます。
タイマーの解放は次のように行われます。
cocoa - 特定の通知がCocoaに投稿されるまでブロックするにはどうすればよいですか?
特定の通知が投稿されるまでスリープ/待機するための最良の方法は何ですか?
データを取得する非同期APIを備えたクラスがありNSNotification
(通知はCocoaから送信されますが、回避することはできません)、単体テストを行う必要があります。
これまでのところ、私はセミビジーウェイトを理解しました:
実行ループ通知の処理なしでは受信されません。しかし、必要な通知が来たらすぐに実行ループから抜け出すにはどうすればよいですか?
iphone - performSelector... メソッド呼び出しによってのみキックされる実行ループを作成する方法は?
スレッドを少しいじっています。これを考えてみましょう: 私はメインスレッドを持っています。新しいスレッドを開始します。そのエントリポイント メソッドで、実行ループを作成します。ドキュメントには、入力ソースが必要であることが記載されています。そうしないと、実行ループがすぐに終了します。悪い。わかった。しかし、performSelector... メソッド呼び出し以外の入力ソースはありません。スレッドが開始された後、少し遅れてそのスレッドで別のメソッドを起動する performSelector メソッドが来ます。そのメソッド内で、別の performSelector 呼び出しが発生します。それぞれ 0.1 ~ 1 秒の遅延があります。したがって、繰り返し起動するタイマーは無意味です;-)
performSelector からキックを受信するために生き続けるように、その実行ループを設定するにはどうすればよいですか? 何もすることがないときはスレッドをスリープさせたい。しかし、彼のお尻に performSelector キックが来ているときは、スレッドが起動して動作するようにしたいと考えています。
何か提案はありますか?
iphone - セレクターを実行ループにエンキューします - [NSObject performSelector:withObject:afterDelay:] を使用しますか?
現在のメソッドが渡され、UI が更新された後にメソッドを実行したいと考えています。そのために、[object performSelector:@selector(someSelector) withObject:someObject afterDelay:0.0]
今使っています。Apple のドキュメントによると、これにより NSTimer が作成され、セレクターがトリガーされて現在の NSRunLoop に追加されます。しかし、私はこれを非常にエレガントだとは思いません。ココアにタイマーなどを作成させずに、セレクターを現在の実行ループに直接エンキューする簡単な方法はありますか?
performSelectorOnMainThread:withObject:waitUntilDone:
(メインスレッドにいる場合)またはオーバーヘッドを減らしperformSelector:onThread:withObject:waitUntilDone:
てwaitUntilDone:NO
やりたいことはありますか?
乾杯と前もって感謝します
ミスターメイジ
iphone - iPhone: CFRunLoop 内のアイテムに優先順位を付ける方法 (OpenGL 関連)
集中的にレンダリングし、HTTP 経由でフェッチする OpenGL アプリケーションがあります。
Apple の OpenGL のサンプルに従って、私はもともとメインのペイント ループに NSTimer を使用していましたが、(他のみんなと同じように) 本当に良い考えではないことがわかりました (ペイントが遅いとペイントが発生すると、処理中のタッチ イベントに大きな遅延が生じることがあるため)。積み重ねるタイマー)。
そのため、現在、 http: //www.idevgames.com/forum/showthread.php?t=17058 (godexsoft による投稿を検索)でユーザー godexsoft によって提供された戦略を使用しています。具体的には、私のレンダー実行ループはメインスレッドにあり、これが含まれています:
この行により、タッチ イベントなどのイベントや通信に関連するイベントが、フレームのレンダリングの間に発生することが可能になります。それは機能しますが、さらに改良したいと思います。他のイベント (通信関連のものなど) よりもタッチ イベントを優先する方法はありますか? それができれば、0.01f の数値を下げて、フレーム レートを向上させることができます。(これは、通信が戻るのに時間がかかることを意味する可能性があることを認識していますが、タッチイベントが遅れていないことは非常に重要です)。
iphone - iPhone - appDidBecomeActive: と実行ループ開始の間で配列が失われましたか?
編集:配列を初期化した直後に配列を手動で保持するための単一の呼び出しに固執し、それで修正されました。デュル。ありがとう。
UIScrollView サブクラスに NSMutableArray を保持し、UIImageView サブクラスのインスタンスをそれぞれサブビューとして追加します。最終的には配列内の順序を再配置する予定であるため、変更可能な配列である必要があります。このバグは、私がそうしようとする前に発生しています。NSLogs を使用して、AppDelegate で applicationDidBecomeActive: が呼び出されるまで、配列が 10 カウントであることを示し、実行ループで 0.001 秒ごとに起動するタイマーを追加しました。初めて起動すると、配列が見つかりません! 私は非常に混乱しており、これを何時間も追跡しようとしています.
タイマーは正常に動作しています (つまり、printCount: が配列にアクセスしない場合は問題ありません)。そこで配列にアクセスしようとすると、タイマーが壊れます。以下の printCount: への通常の呼び出しは機能しますが、タイマーが最初に起動したときに、printCount: へのこれら 2 つの呼び出しの間で何が起こっている可能性がありますか?
私は、デバッガーを使用してプログラムを際限なくステップ実行してきました。配列はこの時点まで正しく、内容が変更された後でもそのメモリ アドレスは同じです。ただし、その後はオブジェクトしかありません。その 10 個の要素は、単一の UITouchData インスタンスに置き換えられます。どこから来たのかわからない。私のイベント処理メソッドはどれも、配列の再割り当てや変更を試みません。何がうまくいかないのでしょうか?私は完全に当惑しています。
iphone - スレッドでのNSTimerの実行
iPhoneSDK3.0を使用してスレッドでNSTimerを実行しようとしています。私はすべてを正しく行っていると思います(新しいrunloopなど)。このエラーが発生したにもかかわらず、viewDidDissappearで[timer invalidate]を呼び出すと、次のようになります。
bool _WebTryThreadLock(bool)、0x3986d60:メインスレッドまたはWebスレッド以外のスレッドからWebロックを取得しようとしました。これは、セカンダリスレッドからUIKitを呼び出した結果である可能性があります。現在クラッシュしています...プログラムは信号「EXC_BAD_ACCESS」を受信しました。
これが私のコードです:
タイマーを無効にする行を削除すると、すべてが正常に機能します。私はそれを無効にすることになっていないのですか、それとも他の間違いを犯していますか?
ありがとう