Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 17.12.2016
Сообщений: 6
1

Не получается сделать вывод процесса

06.01.2018, 15:53. Просмотров 1109. Ответов 11

Вообщем имеется:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void MainWindow::on_pushButton_clicked()
{
    QProcess *console=new QProcess();
 
        console->start("curl -H \"Authorization: Bearer ya29.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" https://www.googleapis.com/drive/v3/files/1QrK40vywAXXXXXXXXXXXXXv_3pHE?alt=media -o XXXXX.sh");
        //console->start("ping -c 3 google.com");
 
        console->waitForReadyRead();
           qDebug() << console->readAllStandardOutput();
 
 
        //console->waitForFinished();
        delete console;
}
То есть я с помощью curl скачиваю файл с гугл диска. И я хотел бы сделать процесс бар который будет отображать процесс загрузки.
Тк вот проблема в том что из процесса curl не получается ничего вывести хотя бы в тот же debug, в то время как если он выполняется в консоли он выводит обновляемое раз в секунду.
Bash
1
2
3
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   249    0   249    0     0    249      0 --:--:-- --:--:-- --:--:--  4220
Вот как раз эти % я бы и хотел брать и использовать в прогрес баре, но ничего не выводится. Попробовал обычный пинг, все работает, думаю дело в том что вывод у curl как бы непрерывный. Вообщем вопрос в том как правильно выводить состояние таких вот "непрерывно выводимых" процессов

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

Если есть способы сделать все это проще можно описать и их, проект чисто любительский, и я совсем новичок в Qt совсем недавно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2018, 15:53
Ответы с готовыми решениями:

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

Не получается сделать вывод
Прошу Вас подсказать! Программу я успешно написал, но не могу сделать вывод значений третьего...

Не получается сделать форматированный вывод
Проблема такая, нужно перевести этот вывод из Delphi на Java WriteLn(#124, i:6, '*', n, '=',...

Вывод текста, не получается сделать отступ на строчку (MFC)
MFC Вывод текст, не получается сделать отступ на строчку, то есть текст идет в одну строчку и...

11
Эксперт С++
1582 / 912 / 777
Регистрация: 06.02.2016
Сообщений: 2,394
Записей в блоге: 28
06.01.2018, 17:39 2
Цитата Сообщение от Гавр Посмотреть сообщение
qDebug() << console->readAllStandardOutput();
Попробуйте производить чтение после того, как console вызовет сигнал finished
http://doc.qt.io/Qt-5/qprocess.html#finished
0
1 / 1 / 0
Регистрация: 17.12.2016
Сообщений: 6
06.01.2018, 17:55  [ТС] 3
Но ведь мне нужны проценты загрузки раз в секунду, по окончанию будет просто 100%, да и я уже пробовал там сверху закоменчено.
0
183 / 175 / 57
Регистрация: 25.09.2014
Сообщений: 828
09.01.2018, 09:38 4
Может можно пойти другим путем? До запроса узнавать размер файла и во время скачивания проверять размер уже скаченного файла?
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
09.01.2018, 11:36 5
А он точно в stdout пишет? Не в stderr?
Попробуйте дёрнуть setProcessChannelMode(QProcess::MergedChannels); перед стартом курлы

Добавлено через 2 минуты
Да и вообще, дёргать вывод по таймеру.
А ещё есть такая проблема, что если курл для загрузки дёргает третью софтину, на вас тут же падает древнее проклятие.
0
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
10.01.2018, 09:14 6
Я реализовал это следующим способом
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
console = new QProcess();
    console->setReadChannel(QProcess::StandardOutput);
    console->start(programName, QIODevice::ReadWrite);
 
    if(console->waitForStarted(waitTime))
        cout << "SUCCESS: start program" << endl;
    else
    {
        cout << "ERROR: start program" << endl;
        return;
    }
а потом в цикле выполнял
C++ (Qt)
1
2
3
if (console->waitForReadyRead(waitTime))
        {
            cout << console->readAll().data();
}
0
Эксперт C
24560 / 15181 / 3209
Регистрация: 24.12.2010
Сообщений: 32,578
10.01.2018, 10:46 7
Я бы сконнектил сигнал readyRead твоего console с каким-то своим слотом, и в этом слоте все уже делал.
Кстати,
Цитата Сообщение от icpu Посмотреть сообщение
А он точно в stdout пишет? Не в stderr?
Это тоже важно.
Проверить можно запуском curl >st.txt 2>er.txt
Тогда выходишь из положения с помощью console->setReadChannel(QProcess::StandardOutput);
0
1 / 1 / 0
Регистрация: 17.12.2016
Сообщений: 6
29.01.2018, 16:03  [ТС] 8
При выводе в Error выводит сразу все по завершению закачки, а не в ее процессе (.

C++ (Qt)
1
2
3
4
5
6
qt5ct: using qt5ct plugin
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
qt5ct: D-Bus system tray: no
qt5ct: D-Bus global menu: no
"  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r  0  262M    0 2478k    0     0  2404k      0  0:01:51  0:00:01  0:01:50 2401k\r  2  262M    2 7150k    0     0  3520k      0  0:01:16  0:00:02  0:01:14 3519k\r  4  262M    4 11.5M    0     0  3900k      0  0:01:08  0:00:03  0:01:05 3899k\r  6  262M    6 16.1M    0     0  4092k      0  0:01:05  0:00:04  0:01:01 4090k\r  7  262M    7 20.6M    0     0  4210k      0  0:01:03  0:00:05  0:00:58 4241k\r  9  262M    9 25.2M    0     0  4286k      0  0:01:02  0:00:06  0:00:56 4675k\r 11  262M   11 29.8M    0     0  4344k      0  0:01:01  0:00:07  0:00:54 4678k\r 13  262M   13 34.3M    0     0  4384k      0  0:01:01  0:00:08  0:00:53 4678k\r 14  262M   14 38.9M    0     0  4418k      0  0:01:00  0:00:09  0:00:51 4681k\r 16  262M   16 43.5M    0     0  4443k      0  0:01:00  0:00:10  0:00:50 4678k\r 18  262M   18 48.0M    0     0  4464k      0  0:01:00  0:00:11  0:00:49 4678k\r 20  262M   20 52.6M    0     0  4482k      0  0:01:00  0:00:12  0:00:48 4678k\r 21  262M   21 57.2M    0     0  4497k      0  0:00:59  0:00:13  0:00:46 4678k\r 23  262M   23 61.8M    0     0  4511k      0  0:00:59  0:00:14  0:00:45 4678k\r 24  262M   24 65.6M    0     0  4472k      0  0:01:00  0:00:15  0:00:45 4531k\r 26  262M   26 70.2M    0     0  4485k      0  0:00:59  0:00:16  0:00:43 4531k\r 28  262M   28 74.7M    0     0  4497k      0  0:00:59  0:00:17  0:00:42 4531k\r 30  262M   30 79.3M    0     0  4506k      0  0:00:59  0:00:18  0:00:41 4531k\r 31  262M   31 83.9M    0     0  4516k      0  0:00:59  0:00:19  0:00:40 4531k\r 33  262M   33 88.4M    0     0  4524k      0  0:00:59  0:00:20  0:00:39 4678k\r 35  262M   35 93.0M    0     0  4531k      0  0:00:59  0:00:21  0:00:38 4681k\r 37  262M   37 97.6M    0     0  4538k      0  0:00:59  0:00:22  0:00:37 4678k\r 38  262M   38  102M    0     0  4544k      0  0:00:59  0:00:23  0:00:36 4681k\r 40  262M   40  106M    0     0  4549k      0  0:00:59  0:00:24  0:00:35 4675k\r 42  262M   42  111M    0     0  4553k      0  0:00:59  0:00:25  0:00:34 4668k\r 43  262M   43  115M    0     0  4530k      0  0:00:59  0:00:26  0:00:33 4524k\r 45  262M   45  119M    0     0  4536k      0  0:00:59  0:00:27  0:00:32 4528k\r 47  262M   47  124M    0     0  4541k      0  0:00:59  0:00:28  0:00:31 4524k\r 49  262M   49  128M    0     0  4546k      0  0:00:59  0:00:29  0:00:30 4531k"
0
Миниатюры
Не получается сделать вывод процесса  
Эксперт C
24560 / 15181 / 3209
Регистрация: 24.12.2010
Сообщений: 32,578
29.01.2018, 18:09 9
Цитата Сообщение от Гавр Посмотреть сообщение
выводит сразу все по завершению закачки, а не в ее процессе (.
А какой сигнал ловишь?
0
1 / 1 / 0
Регистрация: 17.12.2016
Сообщений: 6
07.03.2018, 13:16  [ТС] 10
Проблема решена другим путем, тема закрыта.
0
Эксперт C
24560 / 15181 / 3209
Регистрация: 24.12.2010
Сообщений: 32,578
07.03.2018, 13:22 11
Цитата Сообщение от Гавр Посмотреть сообщение
Проблема решена другим путем
Каким? Секрет?
0
1 / 1 / 0
Регистрация: 17.12.2016
Сообщений: 6
03.05.2018, 03:07  [ТС] 12
не через curl, а средствами qt
типа так
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
QUrl url(ui->webView->page()->mainFrame()->evaluateJavaScript(jScript).toString()); 
 
    QNetworkRequest request;    
    request.setUrl(url);        
    manager->get(request);    
и потом вот так
 QFile *file = new QFile("название файлаl");
        if(file->open(QFile::WriteOnly)){
            file->write(reply->readAll()); 
            file->close();          
            emit onReady();
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2018, 03:07

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

Класс с полями, не получается сделать вывод совпадающей введенной информации
Задача Класс с именем CLINIC, содержащий следующие поля: название поликлиники, ФИО главного...

Не получается сделать рандомный вывод ответа в классе "Предсказатель"
Нужно разработать класс предсказатель. Обязательные методы : - Заполнение перечня ответов (да,...

Не получается отправить сообщение из одного процесса в другой
Добрый день! Нужно передать сообщение из одного процесса в другой. К сожалению я только начинаю...

Вывод процесса в стрим
У меня есть следующий код, который я затем использую для CreateProcess(); STARTUPINFO info;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.