Каким будет оптимальный способ чтения из 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
, который обрабатывает все записи в файл. Он перемещается в другой поток, чтобы не замедлять основной поток с дорогостоящими операциями записи на диск. Многостраничные ситуации чтения обрабатываются блокировками или мьютексами, но это может привести к тому, что файл сначала будет в другом потоке, поскольку основной (желающий прочитать из него) должен будет дождаться завершения записи в таком случае я могу оставить его в основном потоке для начала.
Вариант, который мне не совсем нравится, - это сигналы и слоты, потому что мне кажется немного тяжелым. Я бы в основном отправил запрос на данные и дождался, пока он будет считаться (либо возвращающий данные через сигнал, либо отправляющую переменную, которая будет заполнена данными и ждет сигнала, который был закончен).
После некоторого рассмотрения это, кажется, лучший подход, но я не уверен, что это хороший дизайн.
ли запись в файл действительно замедляет ваше приложение? Я бы ожидал, что ОС будет кэшировать их, если вы не заставили синхронизированный режим. Также правильно ли я понимаю, что вы хотите читать и записывать файл независимо без синхронизации? Я предполагаю, что вы читаете и пишете в разных его частях. Затем вы можете просто открыть файл дважды, один раз для чтения и один раз для записи. – michalsrb
@michalsrb Все синхронные операции ввода-вывода, выполненные из потока графического интерфейса пользователя, являются основной причиной проблем с удобством использования и зависанием GUI - это было так с первого дня API-интерфейса UI, основанного на событиях. Именно поэтому современные API, такие как Universal Windows Platform, имеют в основном асинхронные API: если пользовательский интерфейс блокирует ожидание ввода-вывода, вы даете вашему пользователю плохой опыт. –