CFRunLoopSourceSignal不起作用

时间:2014-09-29 22:02:20

标签: macos qt events

我在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不会被调用。

我用Google搜索,但我找不到任何解决方案?这是一个已知的操作系统错误吗?

初始化细节:

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

1 个答案:

答案 0 :(得分:1)

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