Portál AbcLinuxu, 16. května 2025 05:47

Dotaz: [Qt] Notifikacia o skonceni QSqlQuery

19.10.2010 10:30 kovariadam | skóre: 12 | blog: biased | Košice/Brno
[Qt] Notifikacia o skonceni QSqlQuery
Přečteno: 113×
Odpovědět | Admin
Zdravim, Robim na serverovej aplikacii, ktora potrebuje spustat QSqlQuery z viacerych vstupov, vo viacerych vlaknach. Mam to urobene takto: DataSession: QObject - tato trieda(jedna vramci aplikacie) prida EfsSqlQuery do QQueue v QueryCommiteri: QThread(jeden vramci aplikacie), ma na starosti postupne vyberat dotazi z fronty a spustat ich na pozadi. EfsSqlQuery, QObject, obsahuje 1 QSqlQuery objekt, a jednu metodu, exec(), ktora spusti query volanim QSqlQuery.exec() a emituje signal commited(bool). Vyhodou tejto triedy oproti QSqlQuery je iba v tom, ze dokaze emitovat signal, kedze je potomkom QObject-u narozdiel od QSqlQuery.

Signal chcem chytit takto, v inom(hlavnom) vlakne uz: connect(m_query, SIGNAL(commited(bool)), this, SLOT(process_stage_2(bool)));

a potom zavolam: dataSession.commitQuery(m_query);

dataSession ho prida do fronty queryCommiteru a ten ked dojde na to rada tak ma zavolat EfsSqlQuery.exec()

Ten slot process_stage_2(bool) vsak nikdy neni zavolany.

Pokusim sa pridat relevantny kod: Kod hlavneho vlakna:
connect(m_query.data(), SIGNAL(commited(bool)), this, SLOT(process_stage_2(bool)));
 
dataSession.commitQuery(m_query);

DataSession:
void sk_efs_server::DataSession::commitQuery(QSharedPointer<EfsSqlQuery> query)
{
    sqlMutex->lock();
    sqlQueue->append(query);
    sqlMutex->unlock();
 
    sqlQueueFull->wakeAll();
}

QueryCommiter:

void sk_efs_server::QueryCommiter::run()
{
    QSharedPointer<EfsSqlQuery> query;
 
    forever
    {
        sqlMutex->lock();
        sqlQueueFull->wait(sqlMutex.data());
        query = sqlQueue->dequeue();
        sqlMutex->unlock();
 
        query->exec();
    }
 
    exec();
}

EfsSqlQuery:

bool sk_efs_server::EfsSqlQuery::exec()
{
    bool cted = m_query->exec();
 
    emit commited(cted);
 
    return cted;
}

Poznamka: Qt verzie 4.7, skusal som pri pripajani signalu connectom pridat aj argument Qt::QueuedConnection, nepomohlo to, ale malo by to byt aj tak default, ak je signal z ineho vlakna.

Neviete mi prosim poradit preco ten slot neni nikdy zavolany?

Dakujem
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Na otázku zatím nikdo bohužel neodpověděl.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.