問題タブ [grand-central-dispatch]
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.
objective-c - GCD と RunLoops
私のアプリでは、 ( CFMachPortCreateRunLoopSourceを介して) CFMachPortRefをスレッドCFRunLoopに追加します
今、私は自問自答していましたが、これは GCD を使用して行うことができますか? 独自のNSThreadを生成し、作成されたCFRunLoopSourceRef を CFRunLoopAddSourceを介してその実行ループに追加する代わりに、イベント ポートをディスパッチの実行ループに追加するとしましょう。
GCDの内部の仕組みにより、これはおそらく機能しないと思いますが、本当にわかりません。
アップデート
これまでのところ、イベントタップのコールバック関数もdispatch_source_event_handlerブロックも呼び出されていません。何か案は?
iphone - iOS 4 GCD に関する質問
WWDC 2010 のプレゼンテーションをいくつか見ました。また、ブロックと同時実行性に関するドキュメントのほとんどを読みました。また、Grand Central Dispatch でのシリアル キューでのブロックの使用に関していくつか質問があります。スクロールビューと画像情報の辞書 (画像への URL など) を持つ iOS 4 プロジェクトがあります。GCD とブロックを使用して画像をダウンロードし、スクロールビューに配置して、メイン スレッドをブロックしないようにしたいと考えています。動作するように見える次のコードを書きました。
2 つの質問があります。
同時実行ガイドによると、非スカラー型である囲みスコープから変数をキャプチャするべきではありません - 私のコードでは、NSDictionary* オブジェクトである dict をキャプチャします。キャプチャが許可されていない場合、どのようにコードを記述すればよいですか? ブロックは、実際に使用されている外側のスコープから変数のみをキャプチャしますか?
すべての画像がシリアル ディスパッチ キューを介してフェッチされる前に、現在の ViewController を離れるとどうなりますか? それらを作成したViewControllerがなくなったことを彼らが認識しているとは思わないので、メインスレッドのスクロールビューに画像ビューを挿入する完了ハンドラーを実行するとどうなりますか? それはエラーを引き起こしますか、それとも何ですか?また、ViewController が消えたときに、シリアル キューの残りの操作をキャンセルするにはどうすればよいですか?
よろしくお願いします、
cocoa - NSCollectionViewを更新しないGCDブロック
NSMutableArray
通知をリッスンし、によって監視されているに更新を投稿するCocoaアプリがありますNSCollectionView
。通知は大量に届くので、別のキューを使用して通知を処理し、それに応じて配列を更新することを考えていました。
現在、通知の登録に使用していますが、キューに指定するaddObserverForName:object:queue:usingBlock
と、正常に機能します(配列とNSCollectionView
更新の両方) 。ただし、(を使用して)[NSOperationQueue mainQueue]
独自のキューを作成すると、更新が停止します。デバッガーを使用すると、監視しているアレイが更新されていることがわかります。[[NSOperationQueue alloc] init]
NSCollectionView
これはバグですか、それともここで何かを見逃しましたか?
iphone - dispatch_async タスクが完了したときに通知を受け取るにはどうすればよいですか?
次のような非同期タスクがあります。
バックグラウンド タスクが完了したときに通知を受ける方法はありますか?
または、完了時にメソッドを呼び出すには?
私はドキュメントを読み、dispatch_after を調べましたが、一定時間後にメソッドをディスパッチするように設計されているようです。
助けてくれてありがとう。
iphone - Apple が複数の画像をフェッチするために GCD でランループを使用することを推奨するのはなぜですか?
iOS 4.0 で Grand Central Dispatch を介してイメージ (各 1 ブロック) をロードすることは良い考えですか? (UITableView で使用するため)
WWDC ビデオ セッション 207 および 208 に示されているように、Apple がランループを好むのはなぜですか?
objective-c - パフォーマンス テスト: sem_t vs dispatch_semaphore_t および pthread_once_t vs dispatch_once_t
pthread_once()
およびまたはdispatch_*関数のようなPOSIX呼び出しを使用する方が良い/速いことを知りたかったsem_wait()
ので、小さなテストを作成し、結果に驚いています(質問と結果は最後にあります)。
テスト コードでは、mach_absolute_time() を使用して呼び出しの時間を計っています。これがナノ秒と正確に一致しないことは本当に気にしません。値を互いに比較しているので、正確な時間単位は問題ではなく、間隔の違いのみが重要です。結果セクションの数値は反復可能であり、平均化されていません。時間を平均化することもできましたが、正確な数を探しているわけではありません。
test.m (単純なコンソール アプリケーション、コンパイルが容易):
My iMac (Snow Leopard Server 10.6.4):
私は得る:
MacbookPro (Snow Leopard 10.6.4) の場合:
私が得た:
私が得たiPhone 3GS 4.0.2で:
質問と声明:
sem_wait()
競合しsem_post()
ていないときは遅い- これはなぜですか?
- OSX は互換性のある API を気にしませんか? これを遅くするレガシーコードはありますか?
- なぜこれらの数値は、dispatch_semaphore 関数と同じではないのですか?
sem_wait()
競合しているときとそうでないときとsem_post()
同じくらい遅いです(違いはありますが、競合しているときとそうでないときの大きな違いだと思いました。dispatch_semaphoreコードにあるような数値を期待していました)sem_wait()
名前付きセマフォを使用するとsem_post()
遅くなります。- なんで?これは、プロセス間でセマフォを同期する必要があるためですか? それをすると荷物が増えるかもしれません。
dispatch_semaphore_wait()
競合しdispatch_semaphore_signal()
ていないときは非常に高速です(アップルはこれをよく宣伝しているので、ここでは驚くことではありません).dispatch_semaphore_wait()
競合が発生している場合 よりもdispatch_semaphore_signal()
3 倍遅くなりますsem_wait()
sem_post()
- なぜこれはとても遅いのですか?これは私には意味がありません。これは、競合している sem_t と同等であると予想していました。
dispatch_once()
よりもpthread_once()
約 10 倍速いのはなぜですか? ヘッダーからわかる唯一のことは、関数呼び出しの負担がdispatch_once()
よりも少ないということpthread_once()
です。
動機: セマフォまたは 1 回の呼び出しの作業を完了するための 2 セットのツールが提示されます (その間、他のセマフォのバリアントを実際に見つけましたが、より良いオプションとして取り上げられない限り、それらは無視します)。仕事に最適なツールは何かを知りたいだけです(フィリップスまたはフラットヘッドでネジをねじ込むオプションがある場合、ネジにトルクをかける必要がない場合はフィリップスを選択し、必要な場合はフラットヘッドを選択しますネジを回します)。libdispatch でユーティリティを書き始めると、libdispatch がまだ動作していない他のオペレーティング システムにそれらを移植できない可能性があるようです... しかし、使用するのはとても魅力的です ;)
現状では、移植性と POSIX 呼び出しについて心配する必要がない場合は、libdispatch を使用します。
ありがとう!
iphone - iOS4デバイスでバックグラウンドで大量のデータを送信するためのベストプラクティス?
サーバーに(POSTを使用して)データを送信する必要があるアプリがあります。この機能は、NavigationControllerサブコントローラーの1つにある必要があり、ユーザーはこのコントローラーから離れたり、アプリを閉じたりできる必要があります(iPhone4 / iOS4のみがサポートされます)。スレッド/NSOperationsを使用するか、または/および既存の非同期メソッドを使用してデータを送信する必要がありますか?これを実装するためのアイデア/ベストプラクティスはありますか?
iphone - GCD ディスパッチ ソースと select() の違いは何ですか?
私はいくつかの既存のものを置き換えるいくつかのコードを書いています:
ソケット読み取りコード。これを GCD キューを使用するように変更して、「次の反復で呼び出す必要がある」配列を維持する代わりに、dispatch_async を使用してイベントをキューにポップできるようにします。また、この特定のアクションを /contain/ するために既に GCD キューを使用しているため、より自然な GCD ディスパッチ形式に委譲したいと考えています。(シリアル キューを独占する while() ループではありません)
しかし、これを、ソケット記述子の DISPATCH_SOURCE_TYPE_READ および DISPATCH_SOURCE_TYPE_WRITE に関連付けられたイベント ハンドラーから起動されるディスパッチ ソースに依存する形式にリファクタリングしようとすると、このスケジューリングに依存するライブラリ コードが機能しなくなりました。私の最初の仮定は、DISPATCH_SOURCE_TYPE_READ と DISPATCH_SOURCE_TYPE_WRITE の使用を誤解しているということです。これらのソケット記述子で select() を呼び出すのとほぼ同じ動作になると想定していました。
GCD ディスパッチ ソースを誤解していませんか? または、リファクタリングに関しては、最適ではない状況で使用していますか?
iphone - dispatch_asycn 、Grand Central Dispatch からの早期終了
ディスパッチ非同期でコードを実行しているとしましょう。.. 完了する前に作成したスレッドを終了する方法はありますか? ユーザーがキャンセルをクリックしたときのように
objective-c - Grand Central Dispatch - スレッド間でのデータの受け渡し
バックグラウンドでプロセスを実行して文字列を生成しようとしています。文字列はメイン スレッドで使用されます (リモート サーバーに送信されます)。コードはシミュレーターで正常に動作し、文字列は期待どおりに 2 回ログに記録されます。
デバイス (iPad、4.2、およびさまざまな iPhone) では、毎回 EXC_BAD_ACCESS でクラッシュします。myString は範囲外のようですが、これはウィキペディアの同じ原則が使用されている例に反しているようです。
コードは次のとおりです。
これがクラッシュする理由と、それを修正する最善の方法を知っている人はいますか?
質問を明確にするためにコードを単純化するという間違いを犯しました。
メイン キューで、実際に別の呼び出しで自分自身にメッセージを送ると、これが不正なアクセスの原因になります。
解決策は、非同期キューでメソッドを呼び出し、メソッド内でコードを dispatch_async(dispatch_get_main_queue(), ^{}); でラップすることでした。ブロック。
うまくいけば、これは他の誰かを助けるでしょう。