Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Запуск файлов один за другим

Автор: frefik 30.5.2011, 11:28

Всем привет. Существует следующая таблица.



Задача запускать файлы поочередно из таблицы и завершать их основываясь на их продолжительности.
Проблема не в qprocess, qtime, qtimer или qtreewidget. Я не могу понять как это организовать.

Автор: maint 30.5.2011, 12:19

Цитата(frefik @ 30.5.2011, 17:28) *
Всем привет. Существует следующая таблица.
Задача запускать файлы поочередно из таблицы и завершать их основываясь на их продолжительности.
Проблема не в qprocess, qtime, qtimer или qtreewidget. Я не могу понять как это организовать.

непонятно что за таблица QTableView или чего. Модель чего ? Базы или список сформированный ? А так, берем текущую позицию, считываем поля, запускаем отдельный поток на проигрывание. Когда он закончится и пеcне конец. Если нажать "СТОП" (вроде есть), то завершаем принудительно.

Автор: frefik 30.5.2011, 12:26

QTreeWidget. Можно подробнее, очень надо. Как считывать понятно. На счет потока не понятно, надо что бы сразу же после конца песни запускалась другая.

Автор: RazrFalcon 30.5.2011, 12:48

Проще всего: посмотреть чужие исходники. К примеру SMPlayer.

А вообще, берем все время трека, затем каждую секунду, к примеру, смотрим текущее положение (если это возможно), и сравниваем.
Также, можно написать сигнал, который будет реагировать на окончание трека. Вы вообще что используете для воспроизведения?

Автор: frefik 30.5.2011, 13:02

Дело в том что программа запускает файлы, с помощью программ которые ассоциированные с ними.

алгоритм следующий:
1.процесс запустить(имя программы, файл...)
2. отсчет времени(time.start())
3. проверка, если переменная time приравнивается продолжительности файла, то завершить и подать на обработку следующий файл.


Я впал в какую-то рекурсию, могу представить как проделать это с одним файлом, но как сделать поочередно с файлами.

Пожалуйста отпишитесь.

Автор: RazrFalcon 30.5.2011, 13:09

То есть Вы через QProcess стартуете?

Прога сама завершается или вы ее сами закрываете? Так как можно было просто поставить waitForFinished(), который, к слову, поддерживает задание времени. Так что можно и от сюда плясать.

Так же можно сделать kill() процессу, через нужное время. Но это убивает прокрутку и паузы.

Автор: frefik 30.5.2011, 13:25

Да.
Можете привести пример пожалуйста.

Грубо говоря задача следующая:
файл video1.avi, продолжительность 10 минут
файл video2.avi, продолжительность 5 минут
файл video3.avi, продолжительность 34 минут
Задача поочередно файлы, проиграть программой по-умолчанию.
Не просто запустить, а запустить первый подождать(как?) 10 минут, завершить первый, запустить второй и.т.д.

Мне бы пример.
Как бы вы её реализовали?

Автор: RazrFalcon 30.5.2011, 13:47

QProcess video;
// movieCount - количество фильмов, ну или tableWidget->rowCount(); или в чем вы там выводите.
for (int i=0; i<movieCount; ++i) {
// нужна прога, которая берет файлы из аргументов. В консоли kmplayer movie.avi. Как то так;
video.start("тут пишем путь к программе", QStringList("тут путь к файлу"));
video.waitForFinished(); // если сама завершится.
video.waitForFinished(10000000000); // если нужно ждать, в msecs
//video.close(); //если само не завершится.
}

Автор: Litkevich Yuriy 30.5.2011, 18:30

RazrFalcon, а события GUI (например, таскание окошка) когда обрабатывать будешь?

Автор: RazrFalcon 30.5.2011, 18:35

Можно во втором потоке запускать.
И да, я просто предложил.
Все равно ТС нужно запускать приложения, а как это сделать без QProcess я не знаю.

Автор: Litkevich Yuriy 30.5.2011, 18:48

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

Автор: RazrFalcon 30.5.2011, 18:57

Как?

Автор: Litkevich Yuriy 30.5.2011, 20:06

читать асистент

Автор: frefik 31.5.2011, 9:20

RazrFalcon
Спасибо за помощь

Задачу решил с помощью второго потока и функции sleep() :D .
Кидаю с помощью сигнала QList<QTreeWidgetItem *> list(итемы таблицы) и далее в функции работаю сними, тупо вызываю sleep(), продолжительностью равную длительности файла.
Решение нормальное или тут что-то дико?

Автор: RazrFalcon 31.5.2011, 13:55

Ну если пауза/перемотка не нужна - то норм.

Как по мне, лучше всего настроить в запускаемом плеере автозавершение по окончании воспроизведения. А в вашей проге просто ждать, ака waitForFinished(). ИМХО.

Автор: frefik 1.6.2011, 20:33

Без привязки к конкретному плееру и там еще не только видео файлы, вообщем sleep(), самое то.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)