gpt4 book ai didi

objective-c - GUI 的 NSThread 计时问题

转载 作者:行者123 更新时间:2023-12-03 16:55:19 33 4
gpt4 key购买 nike

我有一个运行无限循环的简单线程。最终,循环将每秒检查 USB 端口上的串行数据数千次,但目前,它只是每秒向 NSTextView 的自定义类写入一次内容。

int i;
for (i=1; i>0; i++)
{
[lock lock];
[[self textStorage] replaceCharactersInRange:NSMakeRange([[self textStorage] length], 0) withString:@"test\n"];
[lock unlock];
sleep(1);
}

问题是它的写入非常零散。它会做一两个,然后等待十秒钟,然后立即吐出十个。如果我用 NSLog(@"test") 替换写入行,它会以均匀的间隔记录。我在主线程中有另一个测试方法,它接受文本字段的输入并将其放入 TextView 中,这样做似乎会更新 TextView 以包含子线程的最新写入。无论如何,此时不应该有任何东西干扰它,但为了确定起见,我已经锁定了所有地方的所有东西。提前致谢。

最佳答案

您应该始终从主线程执行影响 UI 的操作。您可以让子线程创建一个保存结果的临时对象,然后使用 performSelectorOnMainThread:withObject:waitUntilDone:调用另一个方法来对主线程进行必要的修改。

NSString * const MDResultKey = @"MDResult";

- (void)someMethod {
//
int i;
for (i=1; i>0; i++) {
// if necessary, create an object to hold results
NSDictionary *results = [NSDictionary
dictionaryWithObjectsAndKeys:@"test", MDResultKey, nil];

[self performSelectorOnMainThread:@selector(updateUIWithResults:)
withObject:results waitUntilDone:NO];

sleep(1);
}
}


- (void)updateUIWithResults:(NSDictionary *)results {
NSString *result = [results objectForKey:MDResultKey];
[lock lock]; // ?
[[self textStorage] replaceCharactersInRange:
NSMakeRange([[self textStorage] length], 0) withString:result];
[lock unlock]; // ?

}

关于objective-c - GUI 的 NSThread 计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550804/

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