Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Cocoa中读取带有进度条的文件_Objective C_Multithreading_Macos_Cocoa_Grand Central Dispatch - Fatal编程技术网

Objective c 在Cocoa中读取带有进度条的文件

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

我想创建一个进度条,显示文件读取的状态。 我用C++类读取器读取文件,其中包含变量γ进程。

我如何告诉Cocoa使用reader的值更新进度条。\u在不在reader类中编写任何ObjC代码的情况下进行进度

任何帮助都将不胜感激

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();