[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