Проблема памяти листа и нити

Недавно я запустил проект, который может экспортировать некоторые предварительно рассчитанные Grafix/Audio в файлы для последующей обработки.

Все, что я делал, это вставлял новое окно (с индикатором прогресса и кнопкой "Прервать") в мой основной xib и открывал его, используя следующий код:

[NSApp beginSheet: REC_Sheet modalForWindow: MOTHER_WINDOW modalDelegate: self didEndSelector: nil contextInfo: nil];

NSModalSession session=[NSApp beginModalSessionForWindow:REC_Sheet];
RECISNOTDONE=YES;
while (RECISNOTDONE) {
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse)
        break;
    usleep(100);
}

[NSApp endModalSession:session];

Фоновый поток (pthread) был запущен ранее, чтобы фактически выполнить работу и сохранить весь файл targas/wave. Это прекрасно работало, но через некоторое время выяснилось, что основной поток больше не отвечает, и мой объем памяти увеличился и его невозможно остановить. Я попытался отладить его с помощью Instruments и увидел, как много CFHash и т. Д. Растет до бесконечности.

Случайно я щелкнул ниже листа, и временно это помогло, основной поток (AppKit?) Выпускал свои вещи, но только на некоторое время.

Я не могу объяснить это мне, во-первых, я думал, что это был доступ из моего потока к панели прогресса для обновления прогресса (с интервалом в 0,5 секунды), поэтому я обрезал его. Но даже если я ничего не обновляю и ничего не делал с Progressbar, мое приложение пожирает всю память, потому что не выпускает его "Main-Event" или что-то еще.

Есть ли возможность "истощить" этот основной поток памяти (вызов Runloop / NSApp?). И почему, черт возьми, Основной поток больше не отвечает (после этой простой задачи)???

У меня больше нет clou, пожалуйста, помогите!

Заранее спасибо!

PS Как вы, ребята, реализуете материал с "многопоточным заданием" и обновляете свой графический интерфейс???

1 ответ

while (RECISNOTDONE) {
    if ([NSApp runModalSession:session]!=NSRunContinuesResponse)
        break;
    usleep(100);
}

Есть ли причина, по которой вы это делаете? Лист заблокирует родительское окно без необходимости делать что-либо подобное. Вы можете предотвратить выход из вашего приложения.

Если вам действительно нужен приведенный выше код для чего-либо, попробуйте создать пул автоматического выпуска перед отправкой runModalSession: сообщение, затем слив его после (но прежде чем сравнить с NSRunContinuesResponse и сломать).

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