我在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);
答案 0 :(得分:1)
当UI事件循环因事件过载或某些业务逻辑花费太长时间时,很可能会发生这种行为。您应检查业务逻辑并将其移至单独的线程或异步运行。