Ohledne QThreadu - v reakci na clanek http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong jsem zacal pouzivat moveToThread() a je to prijemne. Kdyz na to dojde, clovek ma jen jednu instanci QThreadu a povesi na ni provedeni ruznych aktivnich objektu, ktere delaji kalkulace. Subclassing je v tomto mene pruzny (samozrejme, ze clovek muze v run() pustit leccos v zavislosti na nejakem svem flagu).
Jinak doporucuju metody z hlavicky <QtConcurrent>, chce to cas si je osvojit, ale clovek se oprosti od low-level threadingu a ve spouste pripadu jsou velmi pouzitelne.
Joo na to jsem taky narazil. Ale .. existuje jeste jeden clanek nazvany "you were doing in not so wrong" ktery celkem objektivne porovnava rozdily.
Kdyz to shrnu:
- trvalo to nekolik let nez to dostalo do dokumentace. Jeste vloni dokumentace doporucovala subclassovat QThread
- neexistuji zadne poradne priklady jak to udelat. Specialne chybi priklady jak to cele ukoncit a destruovat
- bezpecne ukonceni vlakna a dealokace zdroju neni uplne jednoduche.
PS: nevite jak to s thread afinity pri pouzivani signalu mezi vlakny? Kdyz poslu z jednoho vlakna do druheho pointer(anebo referenci) na instanci tak mi hrozi ruzne race-conditions. Kdyz poslu "hodnotu" tak k jakemu vlaknu bude patrit trida kterou jsem poslal? A posle se opravdu ta trida anebo se doruci jeji klon? Na tohle jsem nikde nenasel odpoved a zda se mi, ze kazda verze QT se chova trosku jinak.
ja to ukoncuju takto
AuthenticationAsynchHandler::~AuthenticationAsynchHandler()
{
if (m_thread)
{
m_thread->quit();
m_thread->wait();
delete m_thread;
}
delete m_worker;
}
ad PS: posila se klon, pres QueuedConnection mezi vlakny projde jen objekt, ktery se da zmarsalovat (serializovat), strcit do fronty udalosti a prijemci je vytvoren klon. Kvuli tomu musi byt pro mezivlaknovou QueuedConnection znam metatypovemu systemu pres qRegisterMetaType()