Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2017, 05:38   #1
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию macosx + qdiriterator

Так, просто Вобщем интересный "баг" впоймал, если в цикле по QDirIterator добавлять в папку файлы, то на маке iterator->hasNext() сразу фейлится. На линухе все норм.
Вот мне теперь интересно, а если сторонняя прога че запишит в папку, пока длинный цикл листинга идет? Все прерывается? Красота...
alexzk вне форума Ответить с цитированием
Старый 03.11.2017, 07:18   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А сколько файлов было до этого?
waleri вне форума Ответить с цитированием
Старый 03.11.2017, 09:09   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А сколько файлов было до этого?
Ну там у меня удваивается....делается список MOV, для каждого из них вызывается ffmpeg создать из него jpeg. В std::thread через QProcess.

Похоже, все ж дело не в итераторе. Я разделил формирование списка и обработку на 2 цикла. И вот после первого же вызова ffmpeg поток хочет завершаться.

Код:
 using runner_t    = std::shared_ptr<boost::thread>;
    using runnerint_t = std::shared_ptr<std::atomic<bool>>;

    using runner_f_t  = std::function<void(const runnerint_t& should_int)>;
inline runner_t startNewRunner(const runner_f_t& func, size_t stackSizeBytes = 1024 * 1024 * 2)
    {
        auto stop = runnerint_t(new std::atomic<bool>(false));
        boost::thread::attributes attr;
        attr.set_stack_size(stackSizeBytes);

        return runner_t(new boost::thread(attr, std::bind(func, stop)), [stop](boost::thread* p)
        {
            stop->store(true);
            if (p)
            {
                if (p->joinable())
                    p->join();
                delete p;
            }
        });
    }
Срабатывает stop->store(true); что прерывает все циклы внутри функции потока ессно. Кстати уже вот заменил на boost::thread, думал мож стека мало (на маке 512 кб).

Последний раз редактировалось alexzk; 03.11.2017 в 09:13.
alexzk вне форума Ответить с цитированием
Старый 03.11.2017, 13:31   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Разобрался...запуском нового процесса создавалось "ложное пробуждение" conditional_var, которая сигналила, что поток завершился и указатель можно убивать. Что вызывало убивание указателя (см. выше) и соотв. сигнал потоку, что мы тебя убиваем....

Цитата:
В виду некоторых сложностей при создании пробуждающего условия, которое может быть предсказуемых в многопроцессорных системах, могут происходить ложные пробуждения (spurious wakeup). Это означает, что поток может быть пробужден, даже если никто не сигнализировал условной переменной. Поэтому необходимо еще проверять, верно ли условие пробуждение уже после то, как поток был пробужден. Т.к. ложные пробуждения могут происходить многократно, такую проверку необходимо организовывать в цикле.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бюджетный MacOSX mutabor Операционные системы общие вопросы 5 25.12.2010 16:41
Программирование в MacOSX Cocoa Ivan_32 Qt и кроссплатформенное программирование С/С++ 2 28.07.2009 13:18