Objective c 在Cocoa中读取带有进度条的文件
我想创建一个进度条,显示文件读取的状态。 我用C++类读取器读取文件,其中包含变量γ进程。 我如何告诉Cocoa使用reader的值更新进度条。\u在不在reader类中编写任何ObjC代码的情况下进行进度 任何帮助都将不胜感激Objective c 在Cocoa中读取带有进度条的文件,objective-c,multithreading,macos,cocoa,grand-central-dispatch,Objective C,Multithreading,Macos,Cocoa,Grand Central Dispatch,我想创建一个进度条,显示文件读取的状态。 我用C++类读取器读取文件,其中包含变量γ进程。 我如何告诉Cocoa使用reader的值更新进度条。\u在不在reader类中编写任何ObjC代码的情况下进行进度 任何帮助都将不胜感激 ProgressController *pc = [[ProgressController alloc] init]; [pc showWindow:sender]; // Create the block that we wish to run on a diff
ProgressController *pc = [[ProgressController alloc] init];
[pc showWindow:sender];
// Create the block that we wish to run on a different thread
void (^progressBlock)(void);
progressBlock = ^{
[pc.pi setDoubleValue:0.0];
[pc.pi startAnimation:sender];
Reader reader("/path/to/myfile.txt");
reader.read();
while (reader._progress < 100.)
{
dispatch_async(dispatch_get_main_queue(), ^{
[pc.pi setDoubleValue:reader._progress];
[pc.pi setNeedsDisplay:YES];
});
}
}; // end of progressBlock
// Finally, run the block on a different thread
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, progressBlock);
可可部分:
-(IBAction) test:(id) sender
{
ProgressController *pc = [[ProgressController alloc] init];
[pc showWindow:sender];
Reader reader("test.txt");
reader.setCallback(^(double progress)
{
dispatch_async(dispatch_get_main_queue(), ^{
[pc.pi setDoubleValue:progress];
[pc.pi setNeedsDisplay:YES];
});
});
reader.read();
}
谢谢您的帮助。仅仅因为您不想让Reader包含Objective-C代码,并不意味着您只能从外部观察它。它可以通过传入的函数指针调用C函数。它可以使用更通用的函子(函数对象)机制。甚至需要一个街区 您肯定不想在(reader.\u progress<100.)循环时执行该操作。这是一个繁忙的循环。它将以尽可能快的计算机更新进度。它将CPU核心固定在100%的利用率。事实上,它可能会以比运行任务更快的速度将任务排入主调度队列 您只想在读卡器更新其
\u进度成员时更新进度指示器,这将需要读卡器类的某种合作。最后
当你不把它放进队列里的时候,它工作得很好
ProgressController *pc = [[ProgressController alloc] init];
[pc showWindow:sender];
[pc.pi setUsesThreadedAnimation:YES];
Reader reader("test.txt");
reader.setCallback(^(double progress)
{
[pc.pi setDoubleValue:progress];
[pc.pi setNeedsDisplay:YES];
});
reader.read();
但是为什么你会说“这很糟糕,因为它阻塞了主线程”?
因为基本上我的程序在做其他事情之前必须等待文件被读取。
这里有没有我错过的一些基本优化
非常感谢您的帮助。在使用您发布的代码时,您看到了什么问题?主要问题是它不起作用!我是说!基本上,这似乎是一个无限循环。谢谢你的回答。我得出了这个结论,但我不知道怎么做。您是否有示例代码可供建议?例如,在读取器
类上创建一个setCallback(void(^cb)(double))
成员函数。还创建一个void(^\u cb)(double)
成员变量。如果(_cb)阻塞释放(_cb),设置器将执行_cb=块拷贝(cb)代码>。每当读卡器
更新\u progress
,它也应该执行if(\u cb)\u cb(\u progress)代码>。析构函数还应该执行if(_cb)阻塞释放(_cb)代码>。谢谢,我会尝试一下,然后告诉你。嗯……我实际上不知道cocoa部分中的代码应该如何构造。在这一点上有什么帮助吗?你可以做一些类似于reader.setCallback(^(双进度){dispatch_async(dispatch_get_main_queue(),^{[pc.pi setDoubleValue:progress];[pc.pi setNeedsDisplay:YES];})为什么你发布自己的答案并接受它而不是我的?
ProgressController *pc = [[ProgressController alloc] init];
[pc showWindow:sender];
[pc.pi setUsesThreadedAnimation:YES];
Reader reader("test.txt");
reader.setCallback(^(double progress)
{
[pc.pi setDoubleValue:progress];
[pc.pi setNeedsDisplay:YES];
});
reader.read();