[Interest] QThreadPool & writing to the DB
Dmitriy Purgin
dpurgin at gmail.com
Tue Aug 19 13:46:20 CEST 2014
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