dispatch_async与c ++实例 - 应用程序崩溃

时间:2014-04-18 10:21:15

标签: objective-c objective-c-blocks objective-c++

我想在我的Mac App中使用Tesseract,但识别文本会阻止整个应用程序。因此,我尝试使用dispatch_async,但我的应用程序崩溃了EXC_BAD_ACCESS(在" tess->识别(0)"。 这是方法,我使用:

- (void)getText:(void(^)(NSString *response))handler {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        tess->Recognize(0);
        char *text = tess->GetUTF8Text();
        NSString *string = [NSString stringWithUTF8String:text];
        delete [] text;
        handler(string);
    });
}

我认为这是ARC和tesseract的c ++实例的问题。使用__block没有帮助。

更新

这是工作代码。希望这可能对某人有所帮助。

AppDelegate.m

...
[self processPage:myImage withCompletionHandler:^(NSString *text) {
    NSLog(@"%@", text);
}];
...

- (void)processPage:(NSImage*)image withCompletionHandler:(void(^)(NSString *text))completion {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        Tesseract *tess = [[Tesseract alloc] initWithLanguage:@"deu"];
        [tess setImageWithImage:image];
        NSString *text = [tess getText];
        completion(text);
    });
}

Tesseract.mm

- (NSString*)getText {
    tess->Recognize(0);
    char *text = tess->GetUTF8Text();
    NSString *string = [NSString stringWithUTF8String:text];
    delete [] text;
    return string;
}

1 个答案:

答案 0 :(得分:1)

感谢您的帮助。

我最近找到了解决方案。我完成了我创建Tesseract类的完整代码,并将getText方法调用到调度块中。现在它有效。