crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Полностью упаковать графическое приложение в 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  


Цитата(sploid @ 15.7.2009, 11:02) *
То что ты пытаешься сделать идеологически не должно работать. Может как-то по другому решить задачу?


Так в простом exe-шнике работает, как ни странно. Вот код:

#include <QThread>
#include <QPushButton>
#include <QApplication>
#include <iostream>
//-------------------------------------------------------------------------
class Thread : public QThread
{
private:
public:
    Thread(QObject* parent=0)
        : QThread(parent)
    {
        return;
    }
    ~Thread(void)
    {
        return;
    }
    virtual void run(void)
    {
        int argc=0;
        char** argv=NULL;
        QApplication app(argc,argv);
        QWidget w;
        w.show();
    }
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
    Thread th;
    th.start();
    th.wait();
    return 0;
}


Ни при компиляции, ни при выполнении предупреждений не возникает. Отчего он не желает жить в 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  


Цитата(sploid @ 15.7.2009, 17:06) *
У тебя же в коде, QThread создается до создания QCoreApplication.
Эта ситуация, рассматривалась помоему и на кросплатформе и на прогорге. И есть вполне определённый выход из неё.
Надо пошукать по форумам.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
__UNIX_hokum
  опции профиля:
сообщение 15.7.2009, 14:37
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 4.5.2009
Пользователь №: 727

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.7.2009, 14:10) *
Цитата(sploid @ 15.7.2009, 17:06) *
У тебя же в коде, QThread создается до создания QCoreApplication.

Надо пошукать по форумам.


А по каким критериям искать? По QApplication? Попытаюсь, может, что и разыщется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.7.2009, 14:56
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(__UNIX_hokum @ 15.7.2009, 18:37) *
А по каким критериям искать?
Примерно так:
до создания Q[Core]Application
в DLL находится класс
, обсуждалось несколько месяцев назад
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


А вы сами то поняли что сказали?
Цитата(__UNIX_hokum @ 15.7.2009, 9:34) *
Пытаюсь сделать следующее: в 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'ы должны создаваться в главном потоке
Поэтому библиотеку нужно немного утяжелить. Т.е. нужно сделать класс, в котором будут создаваться виджеты и объект потока, чтобы виджеты оставались в главном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 10:29