[C++] QT threads

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

In mijn C++ programma zitten verschillende threads,
nu wil ik vanuit een thread een functie in mijn GUI thread aanroepen die een afbeelding plaatst in een QGraphicsSCene:

code:
1
2
3
4
QPixmap m_pixmap("dicenr1.gif");
QGraphicsPixmapItem *test = new QGraphicsPixmapItem(m_pixmap);
test->setPos(QPoint(0,0));
addItem((QGraphicsItem*)test);


Maar ik krijg volgende error: (deze komt bij het uivoeren van de functie addItem();)
QObject::startTimer: timers cannot be started from another thread


Ik dit probleem opgezocht , op een aantal websites stond dat het niet zo veilig was om functies aan te roepen vanuit een andere thread die manipulaties uitvoeren op QWidgets... hoe kan dit dan opgelost worden?

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Een conditie variabele signalen in die andere thread oid (misschien een event sturen). Dus de GUI thread zelf het werk laten doen, maar de indicatie dat er werk gedaan moet worden vanuit die andere thread sturen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zoijar schreef op maandag 30 maart 2009 @ 10:22:
Een conditie variabele signalen in die andere thread oid (misschien een event sturen). Dus de GUI thread zelf het werk laten doen, maar de indicatie dat er werk gedaan moet worden vanuit die andere thread sturen.
Dus je bedoelt dat we in die andere thread een signal moeten veroorzaken op de QGraphicsScene?
En op die signal een slot moeten definieren met hierin de code voor bijvoorbeeld het toevoegen van de pixmap?

Kunnen we dan zelf een signal definieren op de QgraphicsSene want in de documentatie staat dat dit opbject 3 signalen voorgedefinieerd heeft?

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:46

Matis

Rubber Rocket

Je mag niet crossthreaded resources aanspreken. Beter kun je het doen met een event (zoals hierboven) of een thread en resource safe object aanmaken dat de status aangeeft.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Ten eerste: Je stuurt een 'pointer naar GraphicsItem' naar een andere thread.... is deze pointer altijd geldig? doet de versturende thread nog wat met graphicsItem? Waar wordt het met new gecreerde item weer gedelete? etc etc. Viel me even op.

Communicatie tussen threads bij Qt altijd met slots / signals doen.
let op, dit is niet per definitie thread-safe, je dient altijd goed na te denken over mogelijke problem(zoals ik hierboven aangaf).
Je kan idd niet vanuit de een thread een timer in de andere starten, dit moet je ook niet willen.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op maandag 30 maart 2009 @ 10:31:
Dus je bedoelt dat we in die andere thread een signal moeten veroorzaken op de QGraphicsScene?
En op die signal een slot moeten definieren met hierin de code voor bijvoorbeeld het toevoegen van de pixmap?
ja, dat lijkt me het makkelijkste.
Kunnen we dan zelf een signal definieren op de QgraphicsSene want in de documentatie staat dat dit opbject 3 signalen voorgedefinieerd heeft?
Weet ik niet; ken Qt niet verder.

Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Verwijderd schreef op maandag 30 maart 2009 @ 10:31:
[...]

Kunnen we dan zelf een signal definieren op de QgraphicsSene want in de documentatie staat dat dit opbject 3 signalen voorgedefinieerd heeft?
elke class die de overerft van QObject en de Q_OBJECT macro gebruikt kan in principe signals/slots hebben, custom of built-in.

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt,

We zitte iets verder,

We hebben deze documentatie gevonden:
http://doc.trolltech.com/4.5/threads-mandelbrot.html

Ik heb deze connect functie dus in de gui-thread gezet:

connect(m_board, SIGNAL(MakeAreaCircles1(void)),m_scene, SLOT(MakeAreaCircles(void)));


vervolgens heb ik in de headerfile van de Qthread volgend signal gedefinieerd:

signals:
void MakeAreaCircles1();

en tot slot een private slot in de header file van de graphicsscene (dit is dus nog steeds de gui-thread):
private slots:
void MakeAreaCircles();

Nu geeft hij een linking error omdat MakeAreaCircle1() geen implementatie heeft (maar in het voorbeeld in de documentatie werd er ook geen implementatie voor deze functie voorzien)

Wanneer ik een lege functie hiervan maak dus
signals:
void MakeAreaCircles1(){};

dan krijg ik volgende error bij het runnen:
Object::connect: No such signal Qthread::MakeAreaCircles1()

de connect lukt dus niet:s

iemand tips?

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

- Erf je de QObject class over?
- Gebruikt je class waarin je de signal implementeert de Q_OBJECT macro?
- Waarom zou je een slot zonder implementatie willen?? je wilt immers code uitvoeren bij receiven signal

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
EddoH schreef op maandag 30 maart 2009 @ 11:56:
- Erf je de QObject class over?
- Gebruikt je class waarin je de signal implementeert de Q_OBJECT macro?
- Waarom zou je een slot zonder implementatie willen?? je wilt immers code uitvoeren bij receiven signal
Sorry een fout in het vorige bericht het moet dus:

signals:
void MakeAreaCircles1(){};

zijn bij het signal gaf hij een linking error, waardoor we hiervan een lege functie moesten maken
het slot is wel geimplementeerd maar dan geeft hij een error dat de connect niet gelukt is zo gelijk ik hierboven al zei.
- Gebruikt je class waarin je de signal implementeert de Q_OBJECT macro?
Ja dit heb ik geplaatst maar dan geeft hij volgende error:
error PRJ0019: A tool returned an error code from "Moc'ing Board.h"

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Zorg dan eerst dan je dat probleem oplost.. , je hebt de QOBJECT macro nodig.
Pagina: 1