Полностью упаковать графическое приложение в DLL |
Здравствуйте, гость ( Вход | Регистрация )
Полностью упаковать графическое приложение в DLL |
__UNIX_hokum |
15.7.2009, 8:34
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 0 раз(а) Репутация: 0 |
Доброго времени суток. Пытаюсь сделать следующее: в DLL находится класс, наследованный от QThread, в методе run которого на стеке создаётся экземпляр QApplication и какой-нить QWidget. Из DLL наружу отдаётся экземпляр этого класса, с которым можно работать через интерфейс программе, "не знакомой" с Qt. Всё это безобразие компилируется, запускается, и не работает со следующим предупреждением: "QApplication was not created in the main() thread".
Интернеты сказали следующее: "If you need to marshall widget creation across threads (e.g. thread B wants thread A to create a widget, and must wait for the widget), then you want to make sure to run QEventLoops while you're waiting. That'll make sure any cross-thread QEvents get processed" (http://www.qtforum.org/article/22708/qappl...n-instance.html). Но что-то я не соображу, куда и как этот совет приделать. Если у кого будут соображения по этому поводу -- рад услышать. |
|
|
sploid |
15.7.2009, 10:02
Сообщение
#2
|
Студент Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: 1 |
есть жесткое ограничение, что gui должна работать в основном потоке.
из доки: Note that QCoreApplication::exec() must always be called from the main thread (the thread that executes main()), not from a QThread. In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations. http://doc.trolltech.com/4.5/threads.html То что ты пытаешься сделать идеологически не должно работать. Может как-то по другому решить задачу? |
|
|
__UNIX_hokum |
15.7.2009, 10:08
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 0 раз(а) Репутация: 0 |
То что ты пытаешься сделать идеологически не должно работать. Может как-то по другому решить задачу? Так в простом exe-шнике работает, как ни странно. Вот код:
Ни при компиляции, ни при выполнении предупреждений не возникает. Отчего он не желает жить в DLL -- пока не пойму. |
|
|
sploid |
15.7.2009, 13:06
Сообщение
#4
|
Студент Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: 1 |
еще раз из доки:
In addition, you must create the QApplication (or QCoreApplication) object before you can create a QThread. У тебя же в коде, QThread создается до создания QCoreApplication. Кстати библиотеки грузятся до захода в main, так что не факт что инициализировались нужные переменные. Все что ты делаешь "может работать", а "может и не работать". Это все хак, никто не гарантирует что это будет работать. Т.е. под VS2005 будет работать, а под VS2008 может не работать. Или может работать по другому с переходом на другую версию Qt. Такие штуки можно делать только для развлечения, но не для разработки серьезного софта. |
|
|
Litkevich Yuriy |
15.7.2009, 13:10
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
__UNIX_hokum |
15.7.2009, 14:37
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Litkevich Yuriy |
15.7.2009, 14:56
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Litkevich Yuriy |
15.7.2009, 15:31
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Вот, кажется, одну нашёл: Подключение dll написанной на QT к С++ Builder 6.0
|
|
|
mozgofil |
15.7.2009, 17:22
Сообщение
#9
|
Студент Группа: Участник Сообщений: 32 Регистрация: 23.4.2009 Пользователь №: 706 Спасибо сказали: 0 раз(а) Репутация: 0 |
А вы сами то поняли что сказали?
Пытаюсь сделать следующее: в DLL находится класс, наследованный от QThread, в методе run которого на стеке создаётся экземпляр QApplication и какой-нить QWidget. Из DLL наружу отдаётся экземпляр этого класса, с которым можно работать через интерфейс программе, "не знакомой" с Qt.
|
|
|
Litkevich Yuriy |
15.7.2009, 20:16
Сообщение
#10
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
__UNIX_hokum, вот нашёл ещё у нас
Разумеется QAplication и QWidget'ы должны создаваться в главном потоке Поэтому библиотеку нужно немного утяжелить. Т.е. нужно сделать класс, в котором будут создаваться виджеты и объект потока, чтобы виджеты оставались в главном потоке. |
|
|
Текстовая версия | Сейчас: 15.1.2025, 14:05 |