NSRunAlertPanel вызвал проблему производительности на многопоточности

Иногда мне приходится делать всплывающее окно с предупреждением в моих сегментах кода Какао. Ранее я использовал NSAlert прямо тогда есть runModal идти, пока я обнаружил, что NSRunAlertPanel легче достичь моей цели. Поэтому я решил переключить все свои функции оповещения на NSRunAlertPanel, В большинстве случаев все было в порядке。

Теперь я добавляю многопоточность. я нашел это NSRunAlertPanel появляется явно медленнее, чем NSAlert при перезвоне в главном потоке.

Сегменты кода:

Сначала я создаю тему:

[NSThread detachNewThreadSelector: @selector(tryRunLoop:) toTarget:self withObject:nil];

Тогда эта функцияtryRunLoop в этом потоке вызовите функцию окна оповещения в основном потоке:

while(1)
[self performSelectorOnMainThread:@selector(showAlert:) withObject:anObject waitUntilDone:YES]; 

Функция showAlert в главном потоке делаю все остальное:

NSRunAlertPanel(@"Warning:",@"Just testing", @"YES", nil, nil);

С течением времени ответ всплывающего окна появляется все медленнее и медленнее. Если я использую NSAlert вместо NSRunAlertPanelили не запустил метод popup в главном потоке, симптом должен исчезнуть.

Я также обнаружил, что загрузка ЦП также различалась между этими двумя методами. очевидно NSAlert стоит низкое использование процессора при постоянном нажатии кнопки.

Может ли кто-то объяснить эти явления?

PS: мне не разрешили разместить весь оригинальный проект в сети, так что я создал простой проект Cocoa в Github для имитации симптома и URL, пожалуйста, посмотрите на Known issues сначала в файле Readme.

1 ответ

Хорошо, короткий ответ не использовать NSRunAlertPanel, Это семейство функций было обескуражено в течение некоторого времени и заменено NSAlert, использование NSAlert вместо.

(К сожалению, ссылка на класс для NSRunAlertPanel и т. д. не упоминает об этом; Я пытаюсь вспомнить, где это было впервые задокументировано; возможно, заметка о выпуске)

Другие вопросы по тегам