使用Qt线程保存实时TXT文件的demo
时间: 2024-03-22 13:41:11 浏览: 173
以下是一个使用 Qt 线程保存实时 TXT 文件的示例代码:
```cpp
// 实现一个自定义线程类,用于保存数据到 TXT 文件
class SaveThread : public QThread {
public:
SaveThread(QObject* parent = nullptr)
: QThread(parent)
, m_stop(false)
{
}
void run() override {
QFile file(m_filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
emit error("Failed to open file");
return;
}
QTextStream out(&file);
while (!m_stop) {
// 获取队列中的数据,并写入到文件中
QString data;
if (m_dataQueue.try_dequeue(data)) {
out << data << endl;
} else {
sleep(1); // 如果队列为空,则线程休眠 1 秒
}
}
file.flush();
file.close();
}
void stop() {
m_stop = true;
}
void setFilePath(const QString& filePath) {
m_filePath = filePath;
}
void setDataQueue(moodycamel::ConcurrentQueue<QString>* queue) {
m_dataQueue = queue;
}
signals:
void error(const QString& msg);
private:
QString m_filePath;
moodycamel::ConcurrentQueue<QString>* m_dataQueue;
std::atomic<bool> m_stop;
};
// 在主线程中创建并启动自定义线程
QString filePath = "data.txt";
moodycamel::ConcurrentQueue<QString> dataQueue;
SaveThread saveThread;
saveThread.setFilePath(filePath);
saveThread.setDataQueue(&dataQueue);
saveThread.start();
// 在主线程中往队列中添加数据
QString data = "Hello World";
dataQueue.enqueue(data);
// 在主线程中停止自定义线程
saveThread.stop();
saveThread.wait();
```
在上述代码中,我们使用了 moodycamel::ConcurrentQueue 作为数据队列,将需要保存到 TXT 文件的数据存储到队列中。同时,我们创建了一个自定义线程 SaveThread,该线程从队列中获取数据,并将数据写入到 TXT 文件中。在主线程中,我们通过 enqueue() 方法将数据添加到队列中,通过 stop() 方法停止自定义线程。需要注意的是,在使用自定义线程时,不要直接访问界面元素,否则会导致线程不安全。如果需要更新界面元素,可以通过信号和槽机制实现。
阅读全文