![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
__UNIX_hokum |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 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 |
![]()
Сообщение
#2
|
Студент ![]() Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
есть жесткое ограничение, что 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 |
![]()
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
То что ты пытаешься сделать идеологически не должно работать. Может как-то по другому решить задачу? Так в простом exe-шнике работает, как ни странно. Вот код:
Ни при компиляции, ни при выполнении предупреждений не возникает. Отчего он не желает жить в DLL -- пока не пойму. |
|
|
sploid |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
еще раз из доки:
In addition, you must create the QApplication (or QCoreApplication) object before you can create a QThread. У тебя же в коде, QThread создается до создания QCoreApplication. Кстати библиотеки грузятся до захода в main, так что не факт что инициализировались нужные переменные. Все что ты делаешь "может работать", а "может и не работать". Это все хак, никто не гарантирует что это будет работать. Т.е. под VS2005 будет работать, а под VS2008 может не работать. Или может работать по другому с переходом на другую версию Qt. Такие штуки можно делать только для развлечения, но не для разработки серьезного софта. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
__UNIX_hokum |
![]()
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 4.5.2009 Пользователь №: 727 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Вот, кажется, одну нашёл: Подключение dll написанной на QT к С++ Builder 6.0
|
|
|
mozgofil |
![]() ![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 32 Регистрация: 23.4.2009 Пользователь №: 706 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А вы сами то поняли что сказали?
Пытаюсь сделать следующее: в DLL находится класс, наследованный от QThread, в методе run которого на стеке создаётся экземпляр QApplication и какой-нить QWidget. Из DLL наружу отдаётся экземпляр этого класса, с которым можно работать через интерфейс программе, "не знакомой" с Qt.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
__UNIX_hokum, вот нашёл ещё у нас
Разумеется QAplication и QWidget'ы должны создаваться в главном потоке Поэтому библиотеку нужно немного утяжелить. Т.е. нужно сделать класс, в котором будут создаваться виджеты и объект потока, чтобы виджеты оставались в главном потоке. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 17.2.2025, 10:47 |