Название: про потоки и таймеры в QT4 Отправлено: itan от Октябрь 04, 2006, 14:50 [QT4.2.0] У меня такая проблема: есть ActiveX компонет, который экспортит нужные мне данные в Word. После того как я его вызываю:
Код: reportCreator->dynamicCall("CreateWordDocument(const QString&, const QString&)", "c:/test.doc", "c:/test.xml"); интерфейс замораживается на продолжительное время. Вообще, хотелось бы иметь вместо этого хотя бы анимированный GIF, показывающий что процесс жив! Вопрос в том как это сделать? Можно ли определить вызов dynamicCall в отдельный поток ? или лучше воспользоваться QTimer ? и если да, то как? Название: про потоки и таймеры в QT4 Отправлено: bigirbis от Октябрь 04, 2006, 14:55 Можно сделать проще:
- почкануть поток с месадж-боксом - вызвать dynamicCall в основном потоке - застрелить тот поток по окончании работы dynamicCall. Топорно, но... если сделать наоборот, пользователь не осилит ситуацию и статанет процесс еще раз Название: про потоки и таймеры в QT4 Отправлено: itan от Октябрь 04, 2006, 16:51 Цитата: "bigirbis" Можно сделать проще: - почкануть поток с месадж-боксом - вызвать dynamicCall в основном потоке - застрелить тот поток по окончании работы dynamicCall. Топорно, но... если сделать наоборот, пользователь не осилит ситуацию и статанет процесс еще раз не понял тебя, что значит "почкануть поток с месадж-боксом" ? Вообще-то я хотел что бы виджет с анимацией продолжал работать, во время вызова dynamicCall. Название: про потоки и таймеры в QT4 Отправлено: atak от Октябрь 04, 2006, 19:02 Цитата: "itan" не понял тебя, что значит "почкануть поток с месадж-боксом" ? Вообще-то я хотел что бы виджет с анимацией продолжал работать, во время вызова dynamicCall. Этот месадж-бокс и будет виджетом, который анимацию станет показывать... Название: про потоки и таймеры в QT4 Отправлено: Dendy от Октябрь 04, 2006, 21:31 Создать дополнительньІй поток с сообщением не получится. ВиджетьІ могут бьІть созданьІ только в основном (GUI) потоке.
Попробуй сделать вьІзов dynamicCall() в отдельном потоке. Название: про потоки и таймеры в QT4 Отправлено: Alex03 от Октябрь 05, 2006, 06:24 А вынести в отдельное приложение (по сути оно у Вас так и есть) и пользовать QProcess?
Название: про потоки и таймеры в QT4 Отправлено: bigirbis от Октябрь 05, 2006, 08:41 Цитировать А вынести в отдельное приложение (по сути оно у Вас так и есть) и пользовать QProcess? Не серьезно. Цитировать Создать дополнительньІй поток с сообщением не получится. ВиджетьІ могут бьІть созданьІ только в основном (GUI) потоке. Согласен, лажанулся. Надо наоборот. Только, чтобы виджет получился модальный. Название: про потоки и таймеры в QT4 Отправлено: itan от Октябрь 05, 2006, 08:46 Цитата: "Dendy" Создать дополнительньІй поток с сообщением не получится. ВиджетьІ могут бьІть созданьІ только в основном (GUI) потоке. Попробуй сделать вьІзов dynamicCall() в отдельном потоке. Делаю так: Код: class TestThread : public QThread далее в программе: Код: m_thread.start(); Вообщем, ActiveX начинает выдавать непонятные ошибки. В Debug Output пишется: QAxBase: Error calling IDispatch member CreateWordDocument: Exception thrown by server Цитировать А вынести в отдельное приложение (по сути оно у Вас так и есть) и пользовать QProcess? Имеешь ввиду пересобрать компонент в EXE-шник, а потом запускать его и в командной строке указывать имя процедуры и ее параметры? Название: про потоки и таймеры в QT4 Отправлено: bigirbis от Октябрь 05, 2006, 08:54 А что за объект такой ты контролировать собрался, если даже гугл на запрос
{98C51056-5414-46E9-8FAD-E59099AFFF25} не выдает ниодного ответа? Название: про потоки и таймеры в QT4 Отправлено: Alex03 от Октябрь 05, 2006, 08:56 Цитата: "bigirbis" Цитировать А вынести в отдельное приложение (по сути оно у Вас так и есть) и пользовать QProcess? Не серьезно. Просто строка Код: reportCreator->dynamicCall("CreateWordDocument(const QString&, const QString&)", "c:/test.doc", "c:/test.xml"); Наводит на мысль что есть что-то типа MS офиса или генератора отчёта стороннего разработчика, а их наверняка можно запускать как отдельный процесс. Ну а по отслеживанию состояния дочернего процесса у QProcess всё есть! :) Ежели не так - звиняйте! :) Название: про потоки и таймеры в QT4 Отправлено: itan от Октябрь 05, 2006, 08:59 Цитата: "bigirbis" А что за объект такой ты контролировать собрался, если даже гугл на запрос {98C51056-5414-46E9-8FAD-E59099AFFF25} не выдает ниодного ответа? Это самописный компонет, наши программисты делали, все исходники для него у меня есть. Название: про потоки и таймеры в QT4 Отправлено: Alex03 от Октябрь 05, 2006, 09:06 Цитата: "itan" Цитировать А вынести в отдельное приложение (по сути оно у Вас так и есть) и пользовать QProcess? Имеешь ввиду пересобрать компонент в EXE-шник, а потом запускать его и в командной строке указывать имя процедуры и ее параметры? Зависит от того чей это компонент. Но в общем случае да. Название: про потоки и таймеры в QT4 Отправлено: bigirbis от Октябрь 05, 2006, 09:17 Вообще, мы буквально недавно нечто подобное проворачивали. QAxObject не очень подошел, достаточно геморройно, хотя определенных успехов даже на нем достигли. Мы разделили задачу на 2 процесса, но из-за того, что модуль работы с COM был представлен отдельным проектом, написанным на c#.
добавлено спустя 2 минуты: Кстати, вот пример я публиковал: http://prog.org.ru/forum/htopic_3523_qaxobject.html Название: про потоки и таймеры в QT4 Отправлено: itan от Октябрь 05, 2006, 14:14 Вообщем, перспективы складываются безрадужные. Пробывал разморозить окно следующим образом:
Код: t= new QTimer(this); не получается. Пытался запихнуть обновление по таймеру в отдельный поток: Код: void TestThread::run() Есть еще идеи? Название: про потоки и таймеры в QT4 Отправлено: Alex03 от Октябрь 05, 2006, 14:36 itan. Вы по всей видимости не понимаете принципов современных событийных приложений. Сигналы от таймера будут вызываться только тогда когда вы вернёте управление в цикл обработки сообщений. А оно у Вас в reportCreator->dynamicCall(...) блокируется.
void TestThread::run() { .... reportCreator->dynamicCall(...) .... } А в GUI-главном потоке делаете что хотите. |