gpt4 book ai didi

objective-c - Objective C Cocoa 从单独的线程更新 gui

转载 作者:行者123 更新时间:2023-12-03 16:47:53 25 4
gpt4 key购买 nike

我有一个线程正在递增变量“int count”的值。我想用“int count”的新值更新我的用户界面,直到我通过按停止按钮停止增量。我已设法更新用户界面,但内存占用量不断增加。它并不显示为内存泄漏,而是一个分配问题。每次从线程调用 UI 元素时,堆大小都会增加。我可以清楚地看到仪器泄漏分配部分,我有一些分配,只有在移动触摸 UI 元素的窗口时才会被释放。尽管尝试了一切,我还是没能解决这个问题。如果有更好的方法用“int count”新值更新 UI 元素,请随时告诉我。谢谢

如果您想使用仪器或分配运行来查看问题或查看源代码,我在下面发布了 cocoa 项目的链接。这是一个小项目,只有几行代码。

Xcode Poject GUI UPDATE LINK

-(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com