問題タブ [nslock]
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.
iphone - IOS SDK - NSLock メッセージ: 「ロックしなかったスレッドからロック解除されました」
unlockWithCondition (NSConditionLock を使用) を使用して回避しようとした NSLock を使用してこのエラーが発生していますが、それでも同じ結果が得られます。
* _NSLockError() で中断してデバッグします。* -[NSLock unlock]: ロック ( '(null)') は、ロックしなかったスレッドからロック解除されました。
悪いかどうかはわかりませんが、私がやっていることは次のとおりです。
したがって、セクション「..shared code..」を実行できます。このエラーが発生する理由がわかりません。
誰かが私が間違っていることを説明できますか? 完璧に機能するはずです。
c++ - iOSアプリケーションでコード実行をロックする方法
問題の説明
StdString ShowLockScreen()
この関数には、ユーザーがPINを入力する必要があるUIを表示する関数を呼び出します。関数を呼び出しactivateViewController
た直後に、activateViewController
ユーザーがPINを入力し、開いたUIで[OK]ボタンを押すまですべてのプロセスをロックします。以下に私が試したコードを見ることができます
iOSのソースコード
コードを停止してから呼び出し[theLock lock];
、その後[theLockunlock]を呼び出します。UIとコードから実行を継続します。しかし、私の場合は機能しません。
Androidのソースコード
私はAndroidで同様のアプリケーションを作成しましたが、ここにコードがあります。iOSで同じように書きたいのですが、解決策が見つかりません
研究
私は使用しなければならないと思います
と
しかし、これを私のコードでどのように使用するのですか?
objective-c - キューをスレッドセーフにする
カメラセッションがあり、バッファから画像を取得しています:
そして、私は画像にフィルターを適用しています。別のキューにフィルターを適用したいのですが、スレッドセーフではないため、画像を高速に取得すると、画像がブレンドされます(左から右に50/50、私は思う)、しかし、私はそれをスレッドセーフにしようとしています.NSLockまたはNSRecursiveLockを使用すると、画像がブレンドされるため、機能しません.
誰かが私を助けることができますか?コードをスレッドセーフにする方法についてあまり知識がありません
画像は次のようにブレンドされます: http://i.stack.imgur.com/wjrIl.png
objective-c - @synchronized で iVar やプロパティをロックしますか?
重複の可能性:
@synchronized() は何をしますか?
@synchronized
実際に何ができるのか、私のアプリケーションには何が最適なのかについて質問があります。
NSMutableArray
バックグラウンド スレッドで変更し、フォアグラウンド スレッドでアクセスします。配列の内容を変更しているときに配列にアクセスすると、バックグラウンドの変更から更新された値を取得できる場合は、配列へのアクセスを少し保留したいと思います。NSLock
ただし、特にs とがどのように機能するかについては 100% 確信が持てません@synchronized
。
それが不可能な場合、配列のコピーを変更し、終了したら、アクセサー呼び出しをフリーズするために、コピーの内容を設定するときにプロパティ/インスタンス変数をロックすることは可能ですか?
基本的に、@synchronized(myArray) はアクセサー呼び出しをフリーズしますか (ロックが解放されるまで呼び出しをハングさせてから実行します)?
また、インスタンス変数またはプロパティを NSLock でロックすることは可能ですか? 私が見たところ、コードのブロックのみをロックしているようです。
ios - 複数の UIViewController から Web サービス メソッドへのアクセスを制御する
タブバーと、タブごとに 1 つずつ、3 つの異なる iOS アプリがありUIViewControllers
ます。このアプリは、SudzC を使用して とC# .NET webservice
やり取りし、データベースからデータを取得します。
3 つのビュー コントローラーすべてから呼び出される Web サービス メソッドが 1 つありますが、任意の時点で 1 つのビュー コントローラーのみがメソッドを呼び出すことができ、データが返されるまで他のビュー コントローラーがそのメソッドを呼び出せないようにする必要があります。
で NSLock を定義し、AppDelegate
それぞれに次のコードを実装することで、これを解決しようとしましたviewController
。
Web サービス リターンのハンドラーは次のように定義されます (わかりやすくするために切り捨てられています)。
私の理解では、最初UIViewController
のものはロックを取得し、他のものはロックを取得するために最大 30 秒間ブロックします。ただし、複数の人viewController
が同時にロックにアクセスしようとするまれなケースでは、次のエラーが即座に発生します。
誰が私が間違っているのか教えてもらえますか? C/C++ のロックについてはよく理解していますが、これらの Objective-C のロックは行き詰まっています。
ios - 特定のスレッドで NSLock をロックする方法
私は財産を持っています@property NSLock *myLock
そして、次の 2 つのメソッドを書きたいと思います。
と
これらのメソッドはmyLock
それぞれロックとロック解除を行うため、呼び出されたスレッドまたはキューに関係なく、これを行う必要があります。たとえば、スレッド A がlock
呼び出した可能性がありますが、キュー B が呼び出している可能性がありますunlock
。これらの方法はどちらも、ロックをロックした別のスレッド/キューからロックを解除しようとしていると報告することなく、適切に機能するはずです。さらに、これを同期的に行う必要があります。
ios - アニメーションが完了するまで待機するロックを実行するには?
ユーザー入力を介してアニメーション化するヘルスバーを実装しています。
これらのアニメーションは、特定の量 (たとえば 50 単位) だけ上下に移動し、ボタンを押した結果です。2 つのボタンがあります。増減。
一度に 1 つのスレッドのみが変更できるように、ヘルス バーのロックを実行したいと考えています。問題は、デッドロックが発生していることです。
別のスレッドが別のスレッドによって保持されているロックを実行するためだと思います。しかし、アニメーションが完了すると、そのロックは解除されます。[UIView AnimateWithDuration] が完了したときに終了するロックをどのように実装しますか?
進むべき道なのだろうかNSConditionLock
と思いますが、不必要な複雑さを避けるために、可能であれば NSLocks を使用したいと考えています。おすすめは何ですか?
(最終的には、ユーザー入力を継続しながらアニメーションを「キューに入れる」必要がありますが、今のところ、最初に入力をブロックしても、ロックを機能させたいだけです。)
(うーん、同じ UIView に対して一度に実行される [UIView AnimateWithDuration] は 1 つしかないことを考えてみてください。2 番目の呼び出しは最初の呼び出しを中断し、最初の完了ハンドラーをすぐに実行させます。おそらく、2 番目のロックは、最初にロックを解除する機会があります. この場合、ロックを処理する最良の方法は何ですか? おそらく、グランドセントラルディスパッチに再度アクセスする必要がありますが、より簡単な方法があるかどうかを確認したかった.)
ViewController.h で次のように宣言します。
ViewController.m には次のものがあります。
ロードビューで:
ViewController.m の残りの部分 (関連部分):
出力:
指示を再現するには:「減らす」を1回タップします
touchThreadButton1..
tryTheLock beforeLock..無料。
tryTheLock afterLock.. ロックされています。BEGIN animationBlock - 値: 250 END animationBlock - 値: 250 - 終了: はい
ロックを解除する前にロックを試してください..ロックされています。
tryTheLock afterUnlock..無料。
結論:これは期待どおりに機能します。
--
出力:
手順を再現するには: [減少] をすばやく 2 回タップします (最初のアニメーションを中断します)。
touchThreadButton1..
tryTheLock beforeLock..無料。
tryTheLock afterLock.. ロックされています。BEGIN animationBlock - 値: 250 touchThreadButton1..
tryTheLock beforeLock.. LOCKED. * -[NSLock lock]: デッドロック ( '(null)') * _NSLockError() でブレークしてデバッグします。
結論。デッドロック エラー。ユーザー入力は凍結されています。
objective-c - NSTableView を生成するためのバックグラウンド スレッドの最適な設計パターン
NSOutlineView を設定するためにコア データを取得するためのバックグラウンド スレッドを作成しようとしています。操作には数秒かかることがあるため、操作をバックグラウンド スレッドに入れ、以下に示すようにユーザーに UI を表示したいと考えていました。各セクションの検索が完了すると、メイン スレッドで関数を呼び出して、そのセクションのデータをリロードします。これは正常に動作しているように見えましたが、Core Data フェッチ操作中に例外がスローされたインスタンスが 1 つあります。ユーザーは実際には他に何もできないので、他に何も同時に行うことができない限り、バックグラウンド スレッドで Core Data 呼び出しを行うことはおそらく問題ないと考えました。その後、表示用のデータを保持する配列を更新するコードの周りで NSLock を使用しました。現在、例外を発生させることはできないようです。
私が使用した基本的なアプローチは、以下のコード スニペットに示されています。次のとおりです。 1.initWithNibName
表示用の初期データを入力しますawakeFromNib
。共有オブジェクトの更新中のバックグラウンド スレッドとブロック次のセクションのフェッチのためのバックグラウンド スレッド。
一般に、これは問題なく動作するようであり、メインスレッドですべてを実行して色付きの傘が数秒間回転するのを見るよりも、ユーザーにとってより良い視覚体験を生み出すようです...
これが堅牢なアプローチであるかどうかを誰でも確認できますか? NSLock の機能を完全に理解しているかどうかはわかりません。
objective-c - NSLock を正しく使用していませんが、まだ機能しているようです
スレッドセーフに問題がありました。コンテンツを変更するとスレッド間でエラーが発生するキューがあります。以前はロックを使用したことがありませんでしたが、試してみました。キューのバッキング NSMutableArray を操作するすべてのコードにロックを追加しました。問題は、私がそれらすべてに同じロックを使用しなかったことだと思います。配列を変更した各メソッドで NSLock の新しいインスタンスを作成しました。アレイを保護するには、1 つの NSLock ivar を使用する必要があると想定しています。しかし、私の混乱は、一度追加すると機能したという事実から来ています。以下はサンプルです。新しい NSLock を作成したすべての場所で、ivar NSLock を 1 つだけ使用する必要があったと思います。このコードは、デキューに対するエンキューではなく、他のエンキューに対するエンキューと他のデキューに対するデキューをロックしただけだと思います。明確化は素晴らしいでしょう。