简体   繁体   English

CFRunLoopSourceSignal不起作用

[英]CFRunLoopSourceSignal doesn't work

I'm debugging Qt5.3.1 on Mac, because my program freezes sometimes (intermittent ). 我正在Mac上调试Qt5.3.1,因为我的程序有时会冻结(间歇性地)。 I discovered that it is because the QTimer can't work properly. 我发现这是因为QTimer无法正常工作。

In Qt code, they use the following two lines to trigger function activateTimersSourceCallback 在Qt代码中,他们使用以下两行来触发函数ActivateTimersSourceCallback

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

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

but sometimes, these two lines doesn't work, activateTimersSourceCallback won't get called. 但是有时候,这两行不起作用,activateTimersSourceCallback不会被调用。

I googled, but I couldn't find any solution? 我用谷歌搜索,但找不到任何解决方案? is this a known OS bug? 这是一个已知的OS错误吗?

the initialization details: 初始化详细信息:

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

Such behavior very likely can occur when UI event loop is overloaded with events or some business logic takes too long time. 当UI事件循环因事件而过载或某些业务逻辑花费的时间太长时,很可能发生这种行为。 You should to check your business logic and move it to separate thread or run asynchronous. 您应该检查业务逻辑并将其移至单独的线程或异步运行。

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

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