2016-11-29 5 views
-1

メニューバーのアプリケーションがあり、どこにも(コード変更なし)動作しなくなりました。奇妙なことに、私がそれを選択した後、または私がシステムキー(音量、明るさ、iTunesなど)を使うと、アプリケーションは実行を続けます。私のコードはGCDを使って行動を管理しています。これをデバッグして何が起こっているのか見てみましょうか?私の混乱は、システムキー(ボリュームレベル、輝度レベルを表示するウィンドウをポップアップする)を使用することで私のソフトウェアが実行を継続する理由です。メニューバーのアプリケーションでGCDがハングアップする

DispatchQueue.main.async() { doSomething() } 

func doSomething() { 
    //run a bunch of things in a background process 
    //so far works ok 

    let fooFrame = NSMakeRect(0, 0, 100, 100) 

    print("tag1") //this prints just fine 

    DispqtchQueue.main.sync() { 
     print("tag2") //this doesn't print and doesn't execute until I click on the app or use the volume keys. 
     //run code to update UI works fine once I use volume keys (no idea why) 

     self.window.frame = fooFrame 
    } 
} 

また、メッセージや例外が発生していません。ちょうどアプリがフリーズします。また、複数のディスプレイがあり、メニューバーがアクティブになる2番目のディスプレイをアクティブにすると、プロセスがやり直してすべてが正常であることに気付きました。

+0

(1)私はあなたに重要なコードの部分を与えています。非同期で実行され、同期でいくつかのブロックを実行しようとする機能があります。 (2)非同期呼び出しがまったく同じ場所でハングします。 – MAH

+0

"私はあなたに、私が重要だと思うコードの部分を教えています。"私はそれを知っています。私が言っているのは、あなたが間違っているということです。あなたが何を重要視していたのか分かっていれば、あなた自身の問題を解決できました。 – matt

答えて

0

同じキュー(AnyQueue)からAnyQue.syncを呼び出すと、呼び出し元のタスクが呼び出されたタスクを待機しているため、デッドロックが発生します。しかし、呼び出されたものは呼び出し元が終了した後に開始されます。

mattによって書かれたように、asyncを使用すると問題が修正されます。このコード:

func doSomething() { 
    print("tag1") 
    DispatchQueue.main.async() { 
     print("tag2") 
    } 
} 

DispatchQueue.main.async() { 
    doSomething() 
} 

プリント:

tag1 
tag2 
+0

私は非同期を試みましたが、それは同じ問題です。また、プロセスは、システムキーのいずれかを押した後も(同期対非同期に関係なく)続行されます。それが私に混乱する部分です。 – MAH

+0

私のサンプルはあなたのシステムで 'tag2'を表示しないか、フレーム更新' self.window.frame = fooFrame'が動かないのですか? – shallowThought

+0

タグ2は印刷されません。それは、プレイグラウンドで動作しますが、アプリケーションがUIElement型に変更されたとき、動作を停止するようです。メニュー項目アプリであることについて何か。私はこれをもう少し調べなければなりません。 – MAH

-1

は私が停止するために必要なCFRunLoopランニングを持っていたし、その後、すべてが今、正常に動作するよう、それを考え出しました。さらに、プロセス全体がバックグラウンドディスパッチプロセスとして実行されていたため、同期を使用するのがその理由です。

関連する問題