2012-05-14 22 views
2

問題說明:我們有一個輔助線程,我們在其中完成所有後端處理。在此輔助線程中,我們創建了一個單獨的NSRunLoop來運行。我們創建並在此runloopNSRunLoop在長時間延遲後調用我的選擇器

NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
NSRunLoop * threadRL = [NSRunLoop currentRunLoop]; 
[threadRL addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; 
[threadRL run]; 
[myPool release]; 

每一件事運行,除了調用選擇的一個細微正在採取近10秒到執行使用定時器,這種情況並非隨機每次。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO]; 

我試過這也沒有區別。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO modes:[NSArray arrayWithObjects: NSDefaultRunLoopMode, NSRunLoopCommonModes,nil]]; 

我沒有做在FUNC任何任務,也可能採取這麼多的時間,

什麼,我的想法是,有可能是runloop是在不同的模式。

有沒有辦法讓資金在最高優先級執行,即什麼是在runloop執行被中斷或類似的東西。

回答

0

你可以創建一個NSTimer並設置到目前爲止。請參閱下面的示例代碼。

NSTimer *timer = [[NSTimer alloc] initWithFireDate:now 
                interval:.01 
                target:myClass 
                selector:@selector(funct) 
                userInfo:nil 
                repeats:NO]; 

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
     [runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 
     [runLoop run]; 
+0

有計時器連接到這個runloop。線程上的許多其他performselector正在工作,但這個func並沒有得到長時間的延遲。原因可能是運行循環正在處理某些事情,但我的要求是以非常高的優先級儘快處理func。 –

0

我在回答我自己的問題。我的runloop正在等待NSInputStream:讀取沒有字節時讀取。所以func在runloop源代碼中排隊等待,但是由於線程在socket上等待,所以沒有任何東西被執行。

我已經知道這一點,當我迷上了runloop,並看到它卡在那裏。