- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个线程正在递增变量“int count”的值。我想用“int count”的新值更新我的用户界面,直到我通过按停止按钮停止增量。我已设法更新用户界面,但内存占用量不断增加。它并不显示为内存泄漏,而是一个分配问题。每次从线程调用 UI 元素时,堆大小都会增加。我可以清楚地看到仪器泄漏分配部分,我有一些分配,只有在移动触摸 UI 元素的窗口时才会被释放。尽管尝试了一切,我还是没能解决这个问题。如果有更好的方法用“int count”新值更新 UI 元素,请随时告诉我。谢谢
如果您想使用仪器或分配运行来查看问题或查看源代码,我在下面发布了 cocoa 项目的链接。这是一个小项目,只有几行代码。
-(void) incrementCountGUI:(id)param{ // increment count and update gui
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];// pool just added
count++;
if (count>=100) {// MAKE SURE COUNT DOESN'T GO ABOVE 100
count=0;
}
[sliderDisplayOutlet setIntValue:count];// display value of count in textfield
[sliderOutlet setIntValue:count];// move slider to value of count
[pool release];
}
+(void) updateSliderThread:(id)param{// this thread will call incrementCountGUI method to continuously upgrade UI in the background
NSAutoreleasePool *myThreadPool=[[NSAutoreleasePool alloc]init];
while (shoudStop==NO) {
[ sharedAppInstance performSelectorOnMainThread:@selector(incrementCountGUI:) // update ui in main thread
withObject:nil
waitUntilDone:NO];
usleep(5000);// sleep microsec;
}
[myThreadPool release];
}
- (IBAction)stopCountAction:(id)sender {// START OR STOP counter thread
if ([stopCountButtonOutlet state]==1) { // button depressed=>START
shoudStop=NO;
[NSThread detachNewThreadSelector:@selector(updateSliderThread:) toTarget:[AppController class] withObject:nil];
[stopCountButtonOutlet setTitle: @" STOP" ];
}
if ([stopCountButtonOutlet state]==0){//button depressed=> STOP thread
shoudStop=YES;
[stopCountButtonOutlet setTitle:@" START INCREMENTING COUNT FROM THREAD "];
}
}
- (IBAction)sliderAction:(id)sender { // you can change the value of the variable count manualy.
count=[sliderOutlet intValue];
[sliderDisplayOutlet setIntValue:count];// display value of count
}
最佳答案
1) 首先,您应该永远从主线程以外的线程更新 UI!
_向 mainThread 发布通知,要求其更新 UI,或使用 performSelector:onMainThread:
或 GCD 和 get_main_queue()
,或任何解决方案来使主线程更新UI。
[编辑]抱歉,我错过了您调用 performSelectorOnMainThread:
的代码部分,所以没关系。
2)此外,使用线程来满足您的需要确实没有必要。一般来说,您应该避免线程,而更喜欢其他技术,例如 NSOperationQueues、GCD,甚至 RunLoop 调度。
就您而言,使用线程 usleep(5000) 只是开销,并且会引起许多与多线程相关的问题(请阅读 Apple 的并发编程指南和线程编程指南)。
您可以使用重复的NSTimer
做同样的事情,它会更容易编码和管理,并且会避免很多麻烦。
关于objective-c - Objective C Cocoa 从单独的线程更新 gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7610115/
我是一名优秀的程序员,十分优秀!