Russian Qt Forum
Сентябрь 21, 2024, 09:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не создается объект QPrinter в отдельном процессе.  (Прочитано 18698 раз)
kosproger
Гость
« : Июль 04, 2012, 22:04 »

Доброго времени суток!
Есть один проект, состоящий из консольного и GUI приложения. Консоль собирает pdf-файлы по фтп и отправляет их на печать. GUI запускает данное консольное приложение, используя QProcess. Возникла такая проблема на машине заказчика: при запуске консольного приложения из GUI после того, как скачивается файл, процесс "останавливается" во время создания объекта QPrinter. Т.е. не выполняется строчка
Код:
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
Но, при удалении данного запущенного процесса в GUI-приложении, алгоритм продолжает выполнятся. Т.е. создается объект printer и производится печать.
Если запустить консоль отдельно - все работает.
Плюс ко всему, такой проблемы у себя не наблюдаю...

Подскажите, пожалуйста, в чем может быть дело.
Записан
kosproger
Гость
« Ответ #1 : Июль 05, 2012, 14:16 »

Ситуация повторилась на других машинах, хотя у меня все в порядке и под Linux, и под Windows... Qt 4.8.1
Есть мысли?
Записан
Bepec
Гость
« Ответ #2 : Июль 05, 2012, 14:18 »

Телепаты в отпуске.
Записан
kosproger
Гость
« Ответ #3 : Июль 05, 2012, 14:45 »

GUI приложения позвоялет запускать/останавливать коносльное приложения через QProcess
запуск процесса:
Код:
QProcess *process = new QProcess();
process->setProcessChannelMode(QProcess::MergedChannels);
connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(onProcessFinished(int,QProcess::ExitStatus)));
connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(onRead()));
process->start(appDir + "/PDFPrinter", QStringList() << defProfile);
runnedProcesses.insert(defProfile,process);

Процесс запускается, работает. НО, после скачивания файла его работа останавливается (в прямом смысле) на создании объекта (строка, приведенная в первом посте). Т.е., допустим, если сделать так:
Цитировать
qDebug("before print\n");
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
qDebug("after print\n");
получаю сообщения before print и все.

Если же завершить работу GUI, либо остановить работу консоли через GUI, продолжает выполняться его работа с выделенной строчки. Т.е. Создается printer, получаю сообщение after print, успешно печатается документ и завершается работа.

запущенные процессы храню в Qmap. Когда процесс надо завершить, ему отправляется сообщения об остановке и удаление процесса из Qmap. Получается, что, когда в GUI-приложении процесс удален, т.е. Отвязывается от него, создается printer.

Если запустить консольное приложения без основного все работает верно.
Что еще сообщить?
« Последнее редактирование: Июль 05, 2012, 14:49 от kosproger » Записан
kosproger
Гость
« Ответ #4 : Июль 09, 2012, 10:45 »

ребят, ну я в отчаянии уже... может хоть какие мысли по этому поводу?
Если инфа неполная, что еще сообщить? Могу, в принципе, оба проекта приложить, но они не такие маленькие...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 09, 2012, 10:57 »

ребят, ну я в отчаянии уже... может хоть какие мысли по этому поводу?
Судя по Вашим словам порожденный процесс не может получить доступ к устройству. Мысли простые - надо смотреть в отладчике где висит, а там углубляться в исходники.
Записан
kosproger
Гость
« Ответ #6 : Июль 09, 2012, 11:09 »

Отладчиком надо смотреть что происходит в порожденном процессе. Но как это сделать?
Цитировать
рожденный процесс не может получить доступ к устройству
но я же не устаналиваю название принтера. Я просто создаю объект...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 09, 2012, 11:45 »

Отладчиком надо смотреть что происходит в порожденном процессе. Но как это сделать?
Запустить отладку порожденного, назначив родительский как стартовый. В тех IDE что работаю (Xcode и MSVC) это везде есть
Записан
kosproger
Гость
« Ответ #8 : Июль 09, 2012, 17:24 »

Вроде бы нашел, как в Qt Creator также сделать. Не знал, что возможно, спасибо за наводку!! Улыбающийся
Осталось добраться до машины заказчика. Как будут результаты - сообщу.
Записан
kosproger
Гость
« Ответ #9 : Июль 18, 2012, 19:48 »

Наконец-то получилось добраться до машины заказчика. Понял почему работает у него и не работает у меня. У меня физического принтера нет, есть только виртуальный (PDFCreator). Заказчик работает с реальным принтером. Соответственно, если поставить драйвер на принтер, та же проблема появляется и у меня.
Если смотреть по Debug'у, то на строчке
Код:
QPrinter *printer = new QPrinter(QPrinter::HighResolution);
производится подключение одного из dll драйвера (hpzpi5mc.dll), затем начинается ожидание загрузки других dll. Если завершить GUI процесс, они подключаются, и продолжается работа. Мысли такие, что библиотеки эти блокируются как-то GUI-процессом, при его завершении, соответственно, освобождаются.
« Последнее редактирование: Июль 19, 2012, 11:27 от kosproger » Записан
kosproger
Гость
« Ответ #10 : Июль 19, 2012, 13:45 »

Нет идей?
Записан
Bepec
Гость
« Ответ #11 : Июль 19, 2012, 14:07 »

Идеи от слов не появляются. Тут смотреть надо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июль 19, 2012, 14:10 »

Нет идей?
Ну надо найти на каком системном вызове виснет - и читать про него
Записан
kosproger
Гость
« Ответ #13 : Июль 19, 2012, 17:46 »

Igors, последний вызов в строка 1026 файла qprintengine_win.cpp вот она:
Цитировать
hdc = CreateDC(reinterpret_cast<const wchar_t *>(program.utf16()),
                   reinterpret_cast<const wchar_t *>(name.utf16()), 0, devMode);
по журналу отладки последние действия:
Цитировать
Потребован шаг...
<7456-exec-step
>7456^running
dNOTE: INFERIOR RUN OK
dState changed from InferiorRunRequested(10) to InferiorRunOk(11).
>*running,thread-id="all"
>=library-loaded,id="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRV.DLL",target-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRV.DLL",host-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRV.DLL",symbols-loaded="0",thread-group="i1"
sБиблиотека C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRV.DLL загружена
>=library-loaded,id="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzpi5mc.dll",target-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzpi5mc.dll",host-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzpi5mc.dll",symbols-loaded="0",thread-group="i1"
sБиблиотека C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\hpzpi5mc.dll загружена
d
dNON-CRITICAL TIMEOUT

Если завершить GUI, то шаг продолжает выполняться. По журналу отладки вот что происходит:
Цитировать
>=library-loaded,id="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRVUI.DLL",target-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRVUI.DLL",host-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\UNIDRVUI.DLL",symbols-loaded="0",thread-group="i1"
sБиблиотека C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRVUI.DLL загружена
>=library-loaded,id="C:\\WINDOWS\\system32\\version.dll",target-name="C:\\WINDOWS\\system32\\version.dll",host-name="C:\\WINDOWS\\system32\\version.dll",symbols-loaded="0",thread-group="i1"
sБиблиотека C:\WINDOWS\system32\version.dll загружена
>=thread-exited,id="2",group-id="i1"
sЗавершился поток 2 из группы i1
>=library-loaded,id="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzui5mc.DLL",target-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzui5mc.DLL",host-name="C:\\WINDOWS\\System32\\spool\\DRIVERS\\W32X86\\3\\hpzui5mc.DLL",symbols-loaded="0",thread-group="i1"

........
И далее аналогичная загрузка
........

sЗакончено получение данных
Записан
kosproger
Гость
« Ответ #14 : Июль 20, 2012, 01:58 »

Вот, что обнаружил: в консольном приложении для чтения данных stdin из родительского процесса реализован поток. Если его убрать - инициализации принтеров производится нормально. Почему так, не понимаю...
Видимо придется как-то менять логику консоли, чтобы отвязать от получения данных из GUI.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.127 секунд. Запросов: 23.