gpt4 book ai didi

objective-c - 写入 USB 设备时 NSTextView 未循环更新

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

我正在编写一个与 USB 设备通信的 Objective-C 应用程序。应用程序不断地向设备写入某些数据,并在一个textView(NSTextView的对象)中显示写入操作的状态。当我从设备获取写入操作状态时,我在循环中调用 -[NSTextView insertText:] 方法。

问题是 NSTextView 不会在每次调用 -insertText: 时更新。只有在执行整个循环后,我才能获取 NSTextView 的全部内容。

我没有看到 NSTextView 类的适当刷新或更新方法。如何同时接收操作状态并更新 NSTextView?

- (IBAction)notifyContentHasChanged:(NSInteger) block {
NSString *str;
str = [NSString stringWithFormat:@"Block Written Successfully: %d\n", block];
[data insertText:str];
}

- (IBAction)func {
while(USB_SUCCESS(status))
{
printf("\nBlocks Written Successfully: %d",BlockCnt);
[refToSelf notifyContentHasChanged:BlockCnt];
}
}

请注意,控制台上的 printf 会及时更新,但 NSTextView 不会更新。

最佳答案

Mac OS X 不会立即将 View 更改刷新到屏幕上,以避免此类情况下常见的闪烁和撕裂。这意味着您不能在更新 View 时只是坐在循环中执行阻塞操作;如果这样做,应用程序人机界面中的 View 和其他任何内容都不会更新,并且您的应用程序将显示为挂起并最终获得旋转的光标。

(当应用程序在一小段时间后没有与窗口服务器通信时,就会出现旋转的光标;根据设计,没有办法抑制这种情况。它并不意味着“等待”,而是意味着“这个应用程序已经消失殆尽”,您应该努力确保它永远不会出现在您的用户面前。)

要管理 Cocoa 中的阻塞操作,您可以执行以下两种操作之一:

  1. 您可以在后台线程中执行阻塞操作,并将结果传达给主线程以更新人机界面。例如,您可以使用 select(2) 和标准 UNIX 文件 I/O 调用以这种方式进行 I/O 或套接字通信。

  2. 如果有兼容版本,您可以在运行循环(例如主运行循环)上安排操作;这通常会为您管理阻塞版本操作的后台线程。例如,NSFileHandle 在文件描述符之上提供了运行循环兼容的抽象; NSStream 也为套接字通信执行此操作。

关于objective-c - 写入 USB 设备时 NSTextView 未循环更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/343088/

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