2009-01-08 60 views
0

我正在開發將固件下載到設備的可可應用程序。使用NSProgressIndicator顯示下載進度。在while循環中的DeviceRequestTO方法之後,我調用NSProgressIndicator的-incrementBy:方法。但是隻有在整個固件寫入設備後,進度指示器纔會更新。它一次性顯示100%完成。所以我添加了NSView類的-displayIfNeeded方法。現在它可以順利地顯示進度,但是也會在固件下載完成後出現。我怎樣才能同時完成進度指示和寫入操作?將固件下載到設備時更新進度指示器

以下是代碼:

while(1) 
{ 
    int result = (*dev)->DeviceRequestTO(dev, &request); 
    printf("\nBlocks Written Successfully: %d",DfuBlockCnt); 
    [refToSelf performSelectorOnMainThread:@selector(notifyContent) 
         withObject:nil 
         waitUntilDone:NO]; 
} 

//In main thread 
- (void)notifyContent{ 
    [dnldIndicator incrementBy:1]; 
    [self displayIfNeeded]; 
} 
+0

此方法在一個單獨的線程?如果是這樣,你必須使用-performSelectorOnMainThread更新UI:你能發佈你的代碼嗎? – 2009-01-08 10:32:38

回答

5

你需要調用的方法是setNeedsDisplay:,不displayIfNeeded。後者的意思是「如果有人向您發送了setNeedsDisplay:YES,請發送display」。如果你不這樣做最後一部分,視圖不知道它應該顯示,並且displayIfNeeded什麼也不會做。

而且,一旦添加了setNeedsDisplay:消息,您可能會截斷displayIfNeeded消息,因爲框架始終會定期將該消息發送到窗口(並因此也會發送到其所有視圖)。

0

你的代碼看起來和我在Mac和iPhone上更新UIProgressIndicators和NSProgressIndicators的代碼非常相似,這些代碼完全適合我。我假設,像menumachine,你的while循環存在於後臺線程(使用performSelectorInBackground:withObject創建:或NSThread的detachNewThreadSelector:toTarget:withObject :)。

進度指示器的minValue和maxValue是否正確設置(0和100或任何您的比例)?

更新發生的頻率如何?也許你發送太多事件的速度太快,界面沒有機會正確更新。

這個代碼應該工作,據我所知。