2012-03-18 14 views
6

私はココアのユーザーインターフェイスを開発する際にgui/threading関連の問題が発生しています。アプリケーションは、このように設計されていますメイン以外のスレッドでCocoa GUIを実行する

メインスレッド(#1):引数、負荷プラグインなどを解析し

グイスレッド(#?):GUIは、イベントなどを扱う起動し、そのGUIスレッド。

Cocoaフレームワークはスレッドセーフではありませんが、1つのルールを強制します.GUIはメインスレッドで実行する必要があります。これを確認するためにアサーションが使用されます。これを回避しようとすると、これに続いて自分でrunメソッド(以下のコード)を実装しました - http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html - guide。しかし、私は何かが足りない。ウィンドウが開きますが、空白(完全に白い)のままです。私がメインスレッドで呼び出しを行うと、それは完全に動作しますが。

基本的に私は何が欠落しているのか把握する必要があります。

- (void)run 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self finishLaunching]; 

    shouldKeepRunning = YES; 
    do 
    { 
     [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 

     NSEvent *event = 
      [self 
       nextEventMatchingMask:NSAnyEventMask 
       untilDate:[NSDate distantFuture] 
       inMode:NSDefaultRunLoopMode 
       dequeue:YES]; 

     [self sendEvent:event]; 
     [self updateWindows]; 
    } while (shouldKeepRunning); 

    [pool release]; 
} 

- (void)terminate:(id)sender 
{ 
    shouldKeepRunning = NO; 
} 
+0

あなたのスレッドを使用しているものを逆にする必要があるように見えます。なぜフレームワークと戦うのですか? –

+1

私はむしろプログラムのプラグインアーキテクチャと戦わないので...しかし、私はこの1つを認めなければならないと思うので... – OCarlos

答えて

14

Do not。このアプローチは決してうまくいかないでしょう。あなたの現在の問題(ウィンドウが描画されていない)を修正しても、すぐに別の不明瞭な、解決不可能な問題と別の問題と別の問題が発生します。 Cocoaは、GUIスレッドがメインスレッド、ストーリーの終わりであることを期待しています。

+0

と思っていましたが、とにかく試してみたかったです...返事をありがとう。 – OCarlos

1

なぜこの問題を元に戻しませんか?メインスレッドにスレッドを生成させ(これをアプリケーションスレッドと呼ぶ)、GUIを生成する前にブロックします。アプリケーションスレッドは、引数の解析、プラグインの読み込みなどを行います。初期化が完了すると、アプリケーションスレッドはメインスレッドにメッセージを送り、GUIを起動します。

1

GUIを更新する以外は、バックグラウンドスレッドですべて実行してください。私はあなたがGUIを更新する必要がある行だけを持っていることがわかります。あなたは、メインスレッドですべてのGUIのアップデートを実行することを除いだから、それをあなたがそれをやっている方法を実行します。

dispatch_async(dispatch_get_main_queue(),^
{ 
    [self updateWindows]; 
}); 

は今、私はupdateWindowsだかわからない、私は、これは競合状態を作成しないであろうと仮定しました。

関連する問題