使用Qt线程保存实时TXT文件的demo
时间: 2024-03-22 07:41:06 浏览: 60
以下是一个使用Qt线程实时保存TXT文件的示例:
```c++
#include <QCoreApplication>
#include <QThread>
#include <QFile>
#include <QTextStream>
// 文件写入线程类
class FileWriteThread : public QThread
{
Q_OBJECT
public:
explicit FileWriteThread(QString filePath, QObject *parent = nullptr)
: QThread(parent), m_filePath(filePath)
{
}
signals:
void writeData(QString data);
protected:
void run() override
{
QFile file(m_filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "File open error!";
return;
}
QTextStream out(&file);
while (true)
{
QString data;
// 等待数据写入信号
if (!m_dataQueue.tryDequeue(data))
{
// 等待100毫秒
msleep(100);
continue;
}
// 写入数据到文件
out << data << endl;
}
}
public slots:
void writeDataSlot(QString data)
{
// 将数据添加到队列中
m_dataQueue.enqueue(data);
}
private:
const QString m_filePath;
moodycamel::ConcurrentQueue<QString> m_dataQueue; // 数据队列
};
// 主线程类
class MainThread : public QObject
{
Q_OBJECT
public:
explicit MainThread(QObject *parent = nullptr)
: QObject(parent), m_fileWriteThread(nullptr)
{
}
void start(QString filePath)
{
// 创建文件写入线程
m_fileWriteThread = new FileWriteThread(filePath, this);
connect(this, &MainThread::writeData, m_fileWriteThread, &FileWriteThread::writeDataSlot);
// 启动线程
m_fileWriteThread->start();
}
void write(QString data)
{
// 发送数据写入信号
emit writeData(data);
}
private:
FileWriteThread *m_fileWriteThread;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainThread mainThread;
mainThread.start("test.txt");
for (int i = 0; i < 10; i++)
{
QString data = QString("Data %1").arg(i);
mainThread.write(data);
}
return a.exec();
}
#include "main.moc"
```
这个示例使用了一个 `FileWriteThread` 类来实现文件写入的线程。主线程通过 `write` 函数向文件写入线程发送数据写入信号,文件写入线程则将数据写入到文件中。文件写入线程使用了一个无锁队列来缓存写入的数据,从而避免了多线程之间的竞争问题。
阅读全文