Also, if you're using QThreadPool::globalInstance(), keep in mind that it's max thread count is set to number of cores on the system by default [1]. If you're using an instance of QThreadPool (set by default) for long-running threads as well as for DB queries, you could end up in a situation where the query threads are queued for running instead of actual running [2].
[1] http://qt-project.org/doc/qt-4.8/qthreadpool.html#maxThreadCount-prop [2] http://qt-project.org/doc/qt-4.8/qthreadpool.html#start 2014-08-19 17:46 GMT+06:00 Dmitriy Purgin <dpur...@gmail.com>: > Hi, > > In addition to what Sze-Howe told, you should consider the backend > used by the Qt database driver. In your case of SQLite you could end > up in a situtation where multiple simultaneous INSERT queries > seriously degrade the performance of SQLite engine which uses file > locks to isolate transactions. > > Cheers > > 2014-08-18 12:26 GMT+06:00 Igor Mironchik <igor.mironc...@gmail.com>: >> Hi. >> >> I want to move write to DB operation to another thread (from the GUI >> thread). And I implemented the following QRunnable: >> >> >> // >> >> // SourcesLogWritter >> >> // >> >> >> class SourcesLogWritter >> >> : public QRunnable >> >> { >> >> public: >> >> SourcesLogWritter() >> >> { >> >> setAutoDelete( false ); >> >> } >> >> >> void setData( const QDateTime & dateTime, >> >> const QString & channelName, >> >> Como::Source::Type type, >> >> const QString & sourceName, >> >> const QString & typeName, >> >> const QVariant & value, >> >> const QString & desc ) >> >> { >> >> m_dateTime = dateTime; >> >> m_channelName = channelName; >> >> m_type = type; >> >> m_sourceName = sourceName; >> >> m_typeName = typeName; >> >> m_value = value; >> >> m_desc = desc; >> >> } >> >> >> void run() >> >> { >> >> QSqlQuery insert( QLatin1String( >> >> "INSERT INTO sourcesLog ( dateTime, channelName, type, >> " >> >> "sourceName, typeName, value, desc ) " >> >> "VALUES ( ?, ?, ?, ?, ?, ?, ? )" ) ); >> >> >> insert.addBindValue( dateTimeToString( m_dateTime ) ); >> >> insert.addBindValue( m_channelName ); >> >> insert.addBindValue( (int) m_type ); >> >> insert.addBindValue( m_sourceName ); >> >> insert.addBindValue( m_typeName ); >> >> insert.addBindValue( m_value.toString() ); >> >> insert.addBindValue( m_desc ); >> >> >> insert.exec(); >> >> } >> >> >> private: >> >> QDateTime m_dateTime; >> >> QString m_channelName; >> >> Como::Source::Type m_type; >> >> QString m_sourceName; >> >> QString m_typeName; >> >> QVariant m_value; >> >> QString m_desc; >> >> }; // class SourcesLogWritter >> >> Is it OK to launch this runnable every time when I need to write to the log? >> >> I do the following: >> >> d->m_sourcesLogWritter->setData( dateTime, channelName, >> >> type, sourceName, typeName, value, desc ); >> >> >> QThreadPool::globalInstance()->start( >> >> d->m_sourcesLogWritter.data() ); >> >> And what if previous operation is still not finished and I will launch >> another? >> >> Thanks. >> >> >> _______________________________________________ >> Interest mailing list >> Interest@qt-project.org >> http://lists.qt-project.org/mailman/listinfo/interest >> _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest