Forum » Programiranje » [QT/C++] Spreminjanje objektov na glavnem oknu iz QThread-a
[QT/C++] Spreminjanje objektov na glavnem oknu iz QThread-a
c0dehunter ::
Zdravo,
kako bi lahko priredil vrednost objektu na glavnem oknu (npr. LineEditu) iz QThread-a? Sedaj dobim (logično) napako
Nekje sem bral, da naj bi v thread poslal kazalec na TabWidget (glavno okno), vendar mi nekako ne uspe - je to sploh možna rešitev?
kako bi lahko priredil vrednost objektu na glavnem oknu (npr. LineEditu) iz QThread-a? Sedaj dobim (logično) napako
'ui' was not declared in this scope
Nekje sem bral, da naj bi v thread poslal kazalec na TabWidget (glavno okno), vendar mi nekako ne uspe - je to sploh možna rešitev?
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
Vesoljc ::
objektu QThread moras pac omogocit dostop do okna. nekako najlazje je pac da mu podas kar pointer. to pa v biti lahko naredis na vec nacinov (globalni pointer, member pointer, prek raznih queue-ov, mogoce celo ko nek userdata na raznih eventih...
naredi svoj class, ki deduje QThread, deklariraj member variable tipa TabWidget in ga nastavi preden zalaufas thread. s tem nekako omogocis da ima thread dostop do okna. vendar pa je to najmanjsi problem... vecji problem je sinhronizacija. vedno ko iz drugega threada saris po nekem share-anem memory-ju (kar instanca objekta TabWidget je), moras to poceti eksluzivno (samo en thread naenkrat!). se najbolj smiselen nacin se mi zdi, da si naredis nek asinhron queue (ali dva, data in, data out) (push-pop z locki recimo), v katerem worker thread gleda ce ima kaj za poceti, ce kaj dobi, popne element (neke vrste job description), ga zacne izvajati, ko konca pa pushne rezultat (zopet neke element) v drug queue ter s tem signalizira main thread, da je koncal z doticnim delom. main potem popne rezultat, ter ga izpise v LineEdit-u, recimo. lepota teh queue-ov je to, da mas lahko vec worker threadov, ki pop-ajo job requeste ter jih izvajajo.
http://doc.qt.nokia.com/4.0/threads.html
naredi svoj class, ki deduje QThread, deklariraj member variable tipa TabWidget in ga nastavi preden zalaufas thread. s tem nekako omogocis da ima thread dostop do okna. vendar pa je to najmanjsi problem... vecji problem je sinhronizacija. vedno ko iz drugega threada saris po nekem share-anem memory-ju (kar instanca objekta TabWidget je), moras to poceti eksluzivno (samo en thread naenkrat!). se najbolj smiselen nacin se mi zdi, da si naredis nek asinhron queue (ali dva, data in, data out) (push-pop z locki recimo), v katerem worker thread gleda ce ima kaj za poceti, ce kaj dobi, popne element (neke vrste job description), ga zacne izvajati, ko konca pa pushne rezultat (zopet neke element) v drug queue ter s tem signalizira main thread, da je koncal z doticnim delom. main potem popne rezultat, ter ga izpise v LineEdit-u, recimo. lepota teh queue-ov je to, da mas lahko vec worker threadov, ki pop-ajo job requeste ter jih izvajajo.
http://doc.qt.nokia.com/4.0/threads.html
Abnormal behavior of abnormal brain makes me normal...
c0dehunter ::
Vesoljc, sem poskusil tako, da sem v Nit classu dodal spremenljivko Tabwidget* a, katero nastavim preden zaženem thread. Vendar se zadeva ne zbuilda:
za vrstico
xordie, cross thread slote in signale si še morem naštudirat, ampak bom videl kako bo z časom, ker morem tole do večera oddat.
invalid use of incomplete type 'struct Ui::Tabwidget'
za vrstico
a->ui->tableView->...;
xordie, cross thread slote in signale si še morem naštudirat, ampak bom videl kako bo z časom, ker morem tole do večera oddat.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
c0dehunter ::
Includal sem Qt, vendar ni učinka. Zanimivo je, da do spremenljivke main_engine ki je na glavnem oknu, lahko dostopam, zgornjo napako vrže samo za vrstice, kjer spreminjam dejanske objekte na GUIu (se pravi pri a->main_engine="aa" je vse vredu, naslednja vrstica a->ui->editbox... pa povzroči napako)
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
bitlab ::
Tako kot ti je @xordie predlagal: signal / slot
V glavnem oknu nareti slot, ki ga ob deklaraciji tvojega objekta (QThread) povežeš s signalom iz tega objekta. Signalu določiš poljuben parameter, ki ga sprejmeš v slotu, ki ti lahko naredi poljubno stvar v tvojem glavnem oknu.
Po moje je to ena boljših zadev, ki jih omogoča Qt
V glavnem oknu nareti slot, ki ga ob deklaraciji tvojega objekta (QThread) povežeš s signalom iz tega objekta. Signalu določiš poljuben parameter, ki ga sprejmeš v slotu, ki ti lahko naredi poljubno stvar v tvojem glavnem oknu.
Po moje je to ena boljših zadev, ki jih omogoča Qt
BiTLAB, informacijska tehnologija, d.o.o.
c0dehunter ::
Sem poskušal z signalom, ki ga emita thread object pa slotom v main threadu, pa so še bile ene napake in na koncu nisem uspel dokončati pravočasno. Je pa to samo dodatna funkcionalnost, škoda le da nisem imel več časa za implementacijo.
Hvala vsem za odgovore
Hvala vsem za odgovore
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Qt Designer -> KDevelop C++ ErrorOddelek: Programiranje | 2130 (1660) | 'FireSTORM' |
» | [c++] standardni c++ in dogodki(events)Oddelek: Programiranje | 1759 (1584) | yeti |
» | [QT 4] threading in updatanje widgetovOddelek: Programiranje | 1146 (1019) | Gundolf |
» | [C++] Galerija kodeOddelek: Programiranje | 4102 (3207) | 64202 |
» | Komunikacija med thread-iOddelek: Programiranje | 3766 (3572) | zlatko |