Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > xine_lib выбивает мое приложение


Автор: smalcom 14.11.2006, 12:57
Моя программа для воспроизведения видео использует xine_lib, весь код именно проигрывателя(который использует xine_lib) вынесен в отдельный тред(использую QThread). Проблема в том что в xine_lib много всяких ошибок этапа воспроизведения, запуска и очистки решается тупо путем вызова assert и изза этого завершеется не только тред но и моя программа. Как этого избежать? Пускай завершается только тред я его могу перезапустить, пересоздать etc. Какие есть способы?

Автор: powerfox 14.11.2006, 17:56
Может системно создавать процесс? И отлавливать изменения в поведении проигрывателя?

Автор: MAKCim 14.11.2006, 18:31
smalcom, 
если завершение идет по сигналу - решение простое - его перехват (либо классическим способом, либо в отдельном потоке) и перезапуск QThread-а
если сигнал не генерируется, то я бы сделал так
основной код выделил бы в функцию (функции)
далее
вначале создать 2 потока (QThread и обычный posix (хотя QThread, наверное, через него и реализован, точно не знаю)) и процесс. Процесс выполняет следующее дествие: через определенный промежуток времени проверяет определенное значение в каком-нибудь совместно используемом 2-мя процессами буфере (это может быть в принципе любой IPC) и, если оно установлено, сбрасывает его. Это значение будет показывать то, что основной процесс еще жив. Если проверка показывает, что значение сброшено - это означает уничтожение основного процесса. В этом случае идет перезапуск
Дополнительный поток в основном процессе нужен, чтобы через заранее известный интервал времени устанавливать сброшенное значение

Автор: smalcom 14.11.2006, 19:14
Цитата

если завершение идет по сигналу

эх еслиб ьак было я бы был самым счасливым програмистом  smile , но xine_lib полностью написана на C
В asser'ах xine_lib написано exit(вот это меня и мучает), я думал что может есть какойто выход что при запуске exit из созданного треда не вызывает полный выход из программы.

Цитата

хотя QThread, наверное, через него и реализован

более чем уверен в этом

Цитата

Может системно создавать процесс? И отлавливать изменения в поведении проигрывателя? 

Цитата

это может быть в принципе любой IPC

пока это единственный выход - запускать проигрыватель отдельным процессом и общаца с ним через сокеты, fifo etc. ну и при ошибках спаунить заново(fork, exec)

Автор: MAKCim 14.11.2006, 19:41
Цитата

я думал что может есть какойто выход что при запуске exit из созданного треда не вызывает полный выход из программы.

в linuxthreads такое было бы возможно, т. к там поток - процесс, который совместно с родителем использует ресурсы

Добавлено @ 19:42 
Цитата

эх еслиб ьак было я бы был самым счасливым програмистом  smile , но xine_lib полностью написана на C

а как эти 2 факта связаны?  smile 

Автор: smalcom 14.11.2006, 22:35
Цитата

а как эти 2 факта связаны?  smile

в C нет эксепшенов

Автор: MAKCim 14.11.2006, 22:53
Цитата

в C нет эксепшенов

а какое отношение обработка сигналов имеет к исключениям С++?

Автор: jonie 14.11.2006, 23:46
Цитата

в C нет эксепшенов

__try{..}__finally{..} 
__try{..}__except{..}

мб ? ежели не сигнал ессно.

Автор: smalcom 14.11.2006, 23:59
Цитата

а какое отношение обработка сигналов имеет к исключениям С++?

чесно говоря даже не понял этой фразы с лету  smile 

если бы xine_lib написали на C++ то там бы был удобный механизм использования эксепшенов а не exit'ов.
упрекать разработчиков не имею права но как говорица таковы желания

Автор: MAKCim 15.11.2006, 20:54
Цитата

если бы xine_lib написали на C++ то там бы был удобный механизм использования эксепшенов а не exit'ов.

а, в этом смысле
Цитата

чесно говоря даже не понял этой фразы с лету

 smile 

Автор: smalcom 18.6.2007, 11:48
вопрос решил давно и наверно закрою темку. решил следующим образом - написал обертку похожую на ту что у них в доке и  сделал в консоль вывод ошибок. открываю при помощи openvt и имею щасте вот ужо полгода. усем сенкс.

Автор: proc_maker 18.6.2007, 17:11
Если Вы внимательно почитаете на сайте разработчиков xine, то увидите, что досих пор не существует способа заставить корректно работать xine + Qt в оконном менеджере. Это связано с реализацией блокировок дисплея обеими библиотеками под управлением оконного менеджера. Я полагаю Ваша проблема именно в этом.

Автор: smalcom 18.6.2007, 19:36
проблема была в том, что через меня проходит много видеоинформации и всю ее проигрыватель должен уметь играть, но изза некоторых плохо кодированных файлов возникала ошибка декодера и все натыкалось на ассерт. но... приму к сведению, спасибо.

Автор: smartov 19.6.2007, 16:31
smalcom, о! собрат по несчастью.
Опиши пожалуйста поподробнее как ты решил эту проблему? 
Если не жалко то может какие-то часты сырцов с минимальными обьяснениями. А то тоже падает время от времени приложение.
Заранее спасибо

Автор: smalcom 20.6.2007, 00:47
вот держи сорцы
Код

bool CPlayer::Init()
{
    status = PLAYER_STOPPED;
    return true;
}

bool CPlayer::Stop()
{
    status = PLAYER_STOPPED;
    system("killall xine_player");
    this->terminate();
    return true;
}

void CPlayer::run()
{
FILE *xplayer = NULL;
QString cmd = "/root/xine_player ";
QString re_cmd;

    if(mrl.Type == MTYPE_VIDEO || mrl.Type == MTYPE_KARAOKE)
        cmd += "v \"";
    else
        cmd += "a \"";
    re_cmd = mrl.Path;
    re_cmd.replace("\"", "\\\"");
    re_cmd.replace("`", "\\`");
    cmd += re_cmd + "\"";
    xplayer = popen(QFile::encodeName(cmd).data(), "r");
    if(xplayer == NULL)
    {
        status = PLAYER_ERROR;
        return;
    };
    while(true)
    {
        char res[16];
        int tt = fscanf(xplayer, "%s", res);
        if(tt < 0)
        {
            status = PLAYER_ERROR;
            pclose(xplayer);
            return;
        }
        else if(tt == 0)
        {
            continue;
        };
        if(strcmp(res, "XINE_OK") == 0)
        {
            m_error.AddRecord2STL("(II)Player >> Now playing [");
            m_error.AddRecord2STL(mrl.Path);
            m_error.AddRecord2STL("]\n");
            status = PLAYER_PLAYING;
            while(true)
            {
                int tt = fscanf(xplayer, "%s", res);
                if(tt < 0 || status == PLAYER_STOPPED)
                {
                    status = PLAYER_STOPPED;
                    pclose(xplayer);
                    return;
                };
                sleep(1);
            };
            break;
        }
        else
        {
            m_error.AddRecord2SL("(EE)Player >> Couldnot play [");
            m_error.AddRecord2SL(mrl.Path);
            m_error.AddRecord2SL("]\n");
            status = PLAYER_ERROR;
            pclose(xplayer);
            return;
        };
    };
}



шо нипанятна спрашуй

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)