QFile
から読み込みたい別のスレッドにある最適な読み込み方法は何でしょうか?異なるスレッドのQFileからの読み込み
は考えてみましょう:
class AFile : public QObject
{
Q_OBJECT
public:
AFile(const QString &name, QObject *parent = Q_NULLPTR) : QObject(parent), m_File(name) { m_File.open(QIODevice::ReadWrite); }
public slots:
void write(const QByteArray &data, qint64 pos) { m_File.seek(pos); m_File.write(data); }
private:
mutable QFile m_File;
};
class AData : public QObject
{
Q_OBJECT
public:
using QObject::QObject;
void save(const QByteArray &data) { emit saveData(data, 0); }
signals:
void saveData(const QByteArray &data, qint64 pos) const;
};
AFile file("myfile");
AData data;
QThread *thread = new QThread;
connect(&data, &AData::saveData, &file, &AFile::write);
file.moveToThread(&thread);
thread.start();
data.save("Some data");
//how to concurrently read though?
AFile
は、ファイルへの書き込みをすべて処理しますQFile
のラッパーです。高価なディスク書き込み操作でメインスレッドを遅くしないために、別のスレッドに移動されます。複数の読み込み状況はロックやミューテックスによって処理されますが、メインスレッド(読み込みたい)は書き込みが完了するまで待たなければならないため、最初に別のスレッドにファイルを格納する目的を無効にしますそのような場合、私はそれをメインスレッドに残すことができます。
私は非常に好きではないオプションは、シグナルとスロットです。なぜなら、私はちょっと重い体重に見えるからです。私は基本的にデータの要求を送信し、それが読み取られるのを待ちます(データでデータを返すか、変数を送信してデータで満たされ、完了した信号を待つ)。
これは最良のアプローチだと思われますが、私はそれが良いデザインであるとは本当に確信していません。
は本当にあなたのアプリを遅くファイルに書き込みますか?私はあなたがいくつかの同期モードを強制しない限り、OSがそれらをキャッシュすることを期待します。また、同期せずに独立してファイルを読み書きすることを正しく理解していますか?私はあなたがそれの別の部分で読んで書いていると仮定します。それで、あなたは単にファイルを2回開くことができます。 – michalsrb
@michalsrb GUIスレッドから実行されるすべての同期I/Oは、ユーザビリティの問題の主な原因であり、GUIはハングします。イベントループ駆動UI APIの1日目以降はそうでした。これがUniversal Windows Platformなどの最新のAPIが主に非同期APIを持つ理由です.I/Oを待っているUIがブロックされていると、ユーザーに悪い経験をもたらします。 –