[Interest] QThreadPool & writing to the DB
Dmitriy Purgin
dpurgin at gmail.com
Tue Aug 19 13:58:58 CEST 2014
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 <dpurgin at 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.mironchik at 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 at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>>
More information about the Interest
mailing list