LINUX.ORG.RU

Так вроде ж exec() - это типа Самый Главный Цикл программы и запускать его положено в главном потоке до начала использования qt, а не где попало. Если страх как нужно утащить в другой поток, попробуй создавать поток через pthread_create, а не кутешным классом. Но это какое-то неправильное желание.

const86 ★★★★★
()
Ответ на: комментарий от const86

Ну, у меня желание было (и есть пока) -- затолкать отрисовку картинки в разделяемую библиотеку, и пусть там в одном из потоков крутится. А я ей буду какие-нить параметры передавать.

Мне, собственно, не столько exec() в отдельном потоке нужен, сколько неблокирующий вызов этого самого exec(). Чтобы запустить отображение графики -- и забыть про него.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

У меня с ворнингом, но работает.

#include <QtGui>

class Thread : public QThread {
public:
	virtual void run() {
		QApplication app( NULL, 0 );
		QWidget w;
		w.show();
		qDebug( "exec %d", app.exec() );
	}
};

int main() {
	Thread thr;
	thr.start();

	while( thr.isRunning() ) {
		sleep( 1 );
	}

	return 0;
}

~/src/tmp$ qmake && make && ./tmp
WARNING: QApplication was not created in the main() thread.
QApplication: Invalid Display* argument
exec 0

Какая версия Qt?

summatus
()
Ответ на: комментарий от summatus

> Какая версия Qt?

У меня -- 4.4.3. Счас твой вариант попробую.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

>error: no matching function for call to `QApplication::QApplication(int, NULL)`

Скорми ему туда, что он хочет.

summatus
()

Уже лучше:

//-------------------------------------------------------------------------
class Thread : public QThread
{
private:
int argc;
char** argv;
QWidget* w;
QApplication* app;
public:
Thread(QObject* parent=0) \
: QThread(parent),argc(0), \
argv(NULL),w(NULL),app(NULL) \
{
return;
}
~Thread(void)
{
//if(w) { delete w; }//Если удалять вручную, то при закрытии формы ошибка
//if(app) { delete app;}
return;
}
int createApp(int iargc,char** iargv)
{
argc=iargc;
argv=iargv;
return 0;
}
virtual void run(void)
{
app=new QApplication(argc,argv);
w=new QWidget;
w->show();
std::cout<<"app->exec()="<<app->exec()<<std::endl;
}
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
Thread th;
th.createApp(argc,argv);
th.start();
th.wait();
return 0;
}

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

А зачем главный цикл в отдельный тред для этого? пусть всё рисуется в главном цикле, а подготовка изображений идёт в отдельном треде.

Unnamed_Hero ★★★
()
Ответ на: комментарий от Unnamed_Hero

> А зачем главный цикл в отдельный тред для этого?

Чтобы была видимость асинхронного вызова exec(). Вся эта тягомотина будет в разделяемой библиотеке, а данные отдаёт приложение, понятия не имеющее о классах Qt.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

> Вся эта тягомотина будет в разделяемой библиотеке, а данные отдаёт приложение, понятия не имеющее о классах Qt.

Опасную игру вы затеяли...

const86 ★★★★★
()
Ответ на: комментарий от const86

> Опасную игру вы затеяли...

Меня заставили! Я не хотел!!!
(А что может быть нехорошего-то?)

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

>Осталось выяснить, почему он так против ручного удаления w и app.

А зачем QApplication создавать не локально в run(), а по указателю? Он всё равно только в одном экземпляре может быть. Виджет освобождай в run(), после app.exec(). А лучше и его создавать локально.

summatus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.