繁体   English   中英

CFRunLoopSourceSignal不起作用

[英]CFRunLoopSourceSignal doesn't work

我正在Mac上调试Qt5.3.1,因为我的程序有时会冻结(间歇性地)。 我发现这是因为QTimer无法正常工作。

在Qt代码中,他们使用以下两行来触发函数ActivateTimersSourceCallback

CFRunLoopSourceSignal(d->activateTimersSourceRef);
CFRunLoopWakeUp(mainRunLoop());

void QCocoaEventDispatcherPrivate::activateTimersSourceCallback(void *info)
{
    static int counter = 0;
    NSLog(@"finished activeteTimersSourceCallback %d", counter++);
}

但是有时候,这两行不起作用,activateTimersSourceCallback不会被调用。

我用谷歌搜索,但找不到任何解决方案? 这是一个已知的OS错误吗?

初始化详细信息:

// keep our sources running when modal loops are running
CFRunLoopAddCommonMode(mainRunLoop(), (CFStringRef) NSModalPanelRunLoopMode);

CFRunLoopSourceContext context;
bzero(&context, sizeof(CFRunLoopSourceContext));
context.info = d;
context.equal = runLoopSourceEqualCallback;

// source used to activate timers
context.perform = QCocoaEventDispatcherPrivate::activateTimersSourceCallback;
d->activateTimersSourceRef = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
Q_ASSERT(d->activateTimersSourceRef);
CFRunLoopAddSource(mainRunLoop(), d->activateTimersSourceRef, kCFRunLoopCommonModes);

当UI事件循环因事件而过载或某些业务逻辑花费的时间太长时,很可能发生这种行为。 您应该检查业务逻辑并将其移至单独的线程或异步运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM