Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xine_lib выбивает мое приложение, более надежные способы создания тредов 
V
    Опции темы
smalcom
  Дата 14.11.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
powerfox
Дата 14.11.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 5
Всего: 97



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


--------------------
user posted image
PM WWW   Вверх
MAKCim
Дата 14.11.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

Это сообщение отредактировал(а) MAKCim - 14.11.2006, 18:32


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
smalcom
Дата 14.11.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



Цитата

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

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

Цитата

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

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

Цитата

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

Цитата

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

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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
MAKCim
Дата 14.11.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

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

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

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

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
smalcom
Дата 14.11.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



Цитата

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

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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
MAKCim
Дата 14.11.2006, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
jonie
Дата 14.11.2006, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



Цитата

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

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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
smalcom
Дата 14.11.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



Цитата

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

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

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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
MAKCim
Дата 15.11.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

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

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

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

 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
smalcom
Дата 18.6.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
proc_maker
Дата 18.6.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 11.11.2006

Репутация: 1
Всего: 1



Если Вы внимательно почитаете на сайте разработчиков xine, то увидите, что досих пор не существует способа заставить корректно работать xine + Qt в оконном менеджере. Это связано с реализацией блокировок дисплея обеими библиотеками под управлением оконного менеджера. Я полагаю Ваша проблема именно в этом.
PM MAIL ICQ Skype   Вверх
smalcom
Дата 18.6.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
smartov
Дата 19.6.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



smalcom, о! собрат по несчастью.
Опиши пожалуйста поподробнее как ты решил эту проблему? 
Если не жалко то может какие-то часты сырцов с минимальными обьяснениями. А то тоже падает время от времени приложение.
Заранее спасибо
PM MAIL   Вверх
smalcom
Дата 20.6.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



вот держи сорцы
Код

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;
        };
    };
}



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


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.