問題タブ [cfrunloop]

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 に答える
345 参照

iphone - iPhone のバックグラウンド スレッドでのモーダル アラート

私の iPhone アプリでは、メイン スレッドが多くの作業を行うバックグラウンド スレッドを作成し、場合によってはユーザーに決定を求める必要があります。ユーザーが質問をすると、バックグラウンド スレッドは動作を停止し、ユーザーが質問に回答した後にのみ続行する必要があります。

それを行う最良の方法は何ですか?

PS
iPhone Developer's Cookbook の ModalAlert を試してみましたが、うまくいくと言われていましたが、成功しませんでした。CFRunLoopRun (スレッドの実行を停止することになっている) は、バックグラウンド スレッドを停止しないようです。

私はそのようなコードを持っていました

スレッドNSLogの開始直後に実行されました。syncStart変。

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

macos - CFRunLoopRun()と[NSRunLoop実行]

NSRunLoopオブジェクトがあり、それにタイマーとストリームをアタッチします。それは素晴らしい働きをします。それをやめることは、まったく別の話です。

を使用してループを実行します[runLoop run]

を使用してループを停止しようとするとCRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop])、ループが停止しません。CRunLoopRun()代わりにを使用してループを開始すると、機能します。また、呼び出しが正しいスレッド(カスタム実行ループを実行しているスレッド)で行われることを確認しました。私はこれをでデバッグしましたpthread_self()

メーリングリストのアーカイブを見つけました。開発者は、「CRunLoopStop()のrunメソッドを使用してループを開始した場合は、わざわざ使用しないでください」と言っていますNSRunLoop。なぜそうなのか理解できます。通常、同じ関数セットのイニシャライザーとファイナライザーをペアにします。

NSRunLoop「CFに頼る」ことなく、どうやってやめますか?stopにメソッドが表示されませんNSRunLoop。ドキュメントには、3つの方法で実行ループを停止できると書かれています。

  1. タイムアウト値で実行するように実行ループを構成します
  2. 実行ループに使用を停止するように指示しますCFRunLoopStop()
  3. すべての入力ソースを削除しますが、これは実行ループを停止するための信頼性の低い方法です。これは、背後の実行ループに何が詰まっているのかがわからないためです。

さて、私はすでに2を試しましたが、CFを掘り下げる必要があるため、「醜い」感じがします。3.問題外です-非決定論的なコードは好きではありません。

これにより、1が残ります。ドキュメントを正しく理解している場合、既存の実行ループにタイムアウトを「追加」することはできません。新しい実行ループは、タイムアウト付きでのみ実行できます。新しい実行ループを実行しても、ネストされた実行ループしか作成されないため、問題は解決しません。私はまだ古いものにすぐに戻ります、私が止めたかったのと同じです...そうですか?これを誤解したかもしれません。また、タイムアウト値を使用してループを実行したくありません。その場合、CPUサイクルの書き込み(タイムアウト値が低い)と応答性(タイムアウト値が高い)の間でトレードオフを行う必要があります。

これは私が今持っているセットアップです(擬似コードっぽい):

Communicator.h

Communicator.m

どうしようかな?CFをいじるのは一般的/良いパターンですか?私は財団を十分に知りません。CF層への干渉はおそらく危険ですか(メモリの破損、不整合、メモリリークに関して)?私が達成しようとしていることを達成するためのより良いパターンはありますか?

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

iphone - CFRunLoopRun が機能しないのはなぜですか?

前のコードを考えると、なぜ機能しないのか分かりますかCFRunLoopRun()?. バックグラウンドで呼び出す必要がありregFunます。

バックグラウンド スレッドを停止する他の方法はありますか?

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

pthreads - pthread によって作成された threadFunction 内で CFRunloop メカニズムを使用できる可能性はありますか?

なぜかNSThreadが使えません。しかし、2 つのスレッド間で CFRunloopSource を使用した通信方法は便利だと思います。では、pthread によって作成されたスレッド コンテキスト内で現在の cfrunloop 参照を取得できるのだろうか?

私はオンラインでつかみ、実際に pthread を使用しても runloop ref がまだ利用可能であるというコメントを見ました。しかし、私はドキュメントからこれについて何も見ませんでした。そこで、経験者の方にお聞きしたいです。

さらに、CFRetain(CFRunLoopGetCurrent()) によって新しいスレッドから取得した CFRunloopRef を、新しいスレッドと現在のスレッドの間で共有できますか? CFRunLoopWakeUp(ref) によって新しく作成されたスレッドで runloop をトリガーするときに ref が必要になるため

ありがとう、

ジャック・セラフ

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

objective-c - NSRunLoopは大量のCPUとメモリを消費しています

ワーカースレッドを駆動する無限ループがあります。

ただし、これらのスレッドがCPU(50-100%)とメモリ(1.5GB)を大量に消費している場合があります。この状態でアプリケーションをサンプリングすると、次のトレースが得られました

誰か助けてくれませんか?

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

ios - NSTimer v / s CFRunLoopTimer

私の質問は、どちらを使用するのが良いですか?

NSTimerCFRunLoopTimerオブジェクトを使用します。他のものよりもうまくいくもの私はそれについてグーグルで検索したどのサイトでもそれについて何も得られませんでしたが、Appleのドキュメントwhat to use NSTimer or CFRunLoopTimer?から両方に関するドキュメントを取得しましたが、それらを読んだ後、私は 助けについて理解または明確になりません。

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

ios - CFRunLoopWakeUp が機能しませんか?

効果がないように見えるケースがありCFRunLoopWakeUpます。セットアップは次のとおりです。

メインスレッドにない「典型的な」whileループがあり、いくつかの作業が完了するのを待ちます。

何らかの作業が完了するまで待機するコールバック関数があります。これもメインスレッドから呼び出されません。

コールバックが呼び出されますが、何らかの理由でCFRunLoopWakeUp何もしていないようです。明らかな何かが欠けていますか?ここでいくつかの深いスレッド化の問題が発生していますか? ありがとう!

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

c# - ネイティブコードを呼び出すクラスをコンパイルしようとすると、Monoコンパイラがクラッシュします

次のクラスがあり、Mono(Macの場合)を使用してネイティブコードからC#にいくつかの実行ループ呼び出しをマップしますが、コンパイラーが機能せず、コンパイルしようとすると常にクラッシュします。このクラスのみを含む別のプロジェクトに削除しましたが、まだ壊れているため、このコードに特に問題があるようです。

誰かがこのようなものを見たことがありますか?

コンパイラの出力は次のとおりです。

ソリューションの構築:calling-native-code-mono(デバッグ)

ビルド:calling-native-code-mono(デバッグ)メインコンパイルを実行しています... / Library / Frameworks / Mono.framework / Versions / 2.10.9 / bin / dmcs / noconfig "/ out:/ Users / mauricio / Projects / calling -native-code-mono / bin / Debug / calling-native-code-mono.dll "" /r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.dll " "/r:/Library/Frameworks/Mono.framework/Versions/2.10.9/lib/mono/4.0/System.Core.dll" / nologo / warn:4 / debug:full / optimize- / codepage:utf8 "/ define:DEBUG "/t:library" /Users/mauricio/Projects/calling-native-code-mono/CommonRunLoop.cs "" /Users/mauricio/Projects/calling-native-code-mono/AssemblyInfo.cs "

未処理の例外:System.NullReferenceException:オブジェクト参照がMono.CSharp.EmitContext.Emit(OpCode opcode、Mono.CSharp.MethodSpecメソッド)[0x00000]のオブジェクトのインスタンスに設定されていません:0のMono.CSharp.New.Emit (Mono.CSharp.EmitContext ec、IMemoryLocation target)[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec、Mono.CSharp.Expression source、Boolean Leave_copy、Boolean prepare_for_load)[0x00000] in :0 at Mono.CSharp.Assign.Emit(Mono.CSharp.EmitContext ec、Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at MonoCSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit( Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in: 0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono .CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0 [ERROR] FATAL UNHANDLED EXCEPTION:System.NullReferenceException:Object reference not Mono.CSharp.EmitContext.Emit(OpCode opcode、Mono.CSharp.MethodSpec method)[0x00000] in:0 at Mono.CSharp.New.Emit(Mono.CSharp.EmitContext ec、IMemoryLocation target )[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec、Mono.CSharp.Expression source、Boolean Leave_copy、Boolean prepare_for_load)[0x00000] in:0 at Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec、Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec) [0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock .Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono。 CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[ 0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono。 CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[ 0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:00 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0atMono.CSharp。 Constructor.Emit()[0x00000] in:00 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0atMono.CSharp。 Constructor.Emit()[0x00000] in:0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono .CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0

未処理の例外:System.NullReferenceException:オブジェクト参照がMono.CSharp.EmitContext.Emit(OpCode opcode、Mono.CSharp.MethodSpecメソッド)[0x00000]のオブジェクトのインスタンスに設定されていません:0のMono.CSharp.New.Emit (Mono.CSharp.EmitContext ec、IMemoryLocation target)[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec、Mono.CSharp.Expression source、Boolean Leave_copy、Boolean prepare_for_load)[0x00000] in :0 at Mono.CSharp.Assign.Emit(Mono.CSharp.EmitContext ec、Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at MonoCSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit( Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in: 0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono .CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0 [ERROR] FATAL UNHANDLED EXCEPTION:System.NullReferenceException:Object reference not Mono.CSharp.EmitContext.Emit(OpCode opcode、Mono.CSharp.MethodSpec method)[0x00000] in:0 at Mono.CSharp.New.Emit(Mono.CSharp.EmitContext ec、IMemoryLocation target )[0x00000] in:0 at Mono.CSharp.VariableReference.EmitAssign(Mono.CSharp.EmitContext ec、Mono.CSharp.Expression source、Boolean Leave_copy、Boolean prepare_for_load)[0x00000] in:0 at Mono.CSharp.Assign.Emit (Mono.CSharp。EmitContext ec、Boolean is_statement)[0x00000] in:0 at Mono.CSharp.Assign.EmitStatement(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec) [0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock .Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono。 CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[ 0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:0BlockVariableDeclaration.DoEmit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Statement.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.DoEmit(Mono。 CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Block.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[ 0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.Constructor.Emit()[0x00000] in:00 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0atMono.CSharp。 Constructor.Emit()[0x00000] in:00 at Mono.CSharp.ExplicitBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0 at Mono.CSharp.ToplevelBlock.Emit(Mono.CSharp.EmitContext ec)[0x00000] in:0atMono.CSharp。 Constructor.Emit()[0x00000] in:0
at Mono.CSharp.TypeContainer.EmitType()[0x00000] in:0 at Mono.CSharp.ModuleContainer.Emit()[0x00000] in:0 at Mono.CSharp.AssemblyDefinition.Emit()[0x00000] in:0 at Mono .CSharp.Driver.Compile()[0x00000] in:0 at Mono.CSharp.Driver.Main(System.String [] args)[0x00000] in:0ビルド完了-1エラー、0警告

- - - - - - - - - - - 終わり - - - - - - - - - - -

ビルド:1エラー、0警告

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

objective-c - iOS: CFRunLoopRun() 関数の混乱

CFRunLoop について読んだことがありますが、まだ少し混乱しています。私は自分自身で明確にしたいコードにクロスしました:

では、これがすべてメイン スレッドで呼び出されていると仮定すると、メイン スレッドがブロックされますか? それとも、CFRunLoopRun() 関数呼び出しによって新しいスレッドを生成しますか?

ありがとう!

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

macos - Core Foundation メッセージ ポートを使用して実行ループ ソース間で通信する方法

2 つの実行ループ間の通信用のメッセージ ポートを作成しようとする次のコードがあります。1 つの実行ループは pthread の代わりに実行され、もう 1 つはメインの実行ループです。この機能は、さまざまな条件下で正常に機能しているように見えますが、いずれも望ましい条件ではありません。

たとえば、kCFRunLoopDefaultMode の代わりに NULL を渡すと機能しますが、ブロックされません。

sndData とMessagePortProc コールバックからの戻り値 (rerun NULL) の両方に kCFRunLoopDefaultMode と NULL データを渡すことも期待どおりに機能しますが、MessagePortProc コールバックからデータを送受信する必要があるため、メッセージ ポートを使用する必要があり ます

kCFRunLoopDefaultMode が使用され、かつ MessagePortProc 戻り値または sndData パラメータのいずれかがNOT NULLである場合、 CFMessagePortSendRequest ブロックが返され、決して返されません。MessagePortProc は正常に呼び出され、呼び出された場所に制御を返すことはありません。エラーメッセージは出力されず、クラッシュも発生せず、ただそこに留まっています。

テストケースとして、送信データと受信データの両方に対して、以下に概説する小さなバイト配列から作成された単純な CFDataRef を使用しています。いずれかが、概説された動作を引き起こします。