首页 > 解决方案 > 如何使用 C++ 实现并发文件/文本编辑?

问题描述

我正在开发一个带有 Qt 的小项目(用于学习 Qt 和一些 c++ 练习),我想要实现的是多个用户可以阅读和编辑文档的“在线编码编辑器”的克隆。不必在线,主要目的是处理并发文件编辑。我只是不知道如何处理这项任务。

到目前为止,我所做的是构建一个简单的文本编辑器。程序有两个文本区域。在文本区域 1 中,您编写代码。在文本区域 2 中显示输出。当您运行代码时,它将文本区域 1 的内容保存到文件(例如 Code.cpp)中,然后编译保存的文件。编译后,另一个函数运行 exe 并将输出写入另一个文件(这在 powershell 的 Out-File 命令中完成)。文本区 2 只是读取输出文件的内容。

对于单个用户,这有效。问题是当有多个用户时我不知道如何处理。有人建议我应该使用文本编辑器程序作为客户端并在服务器中处理并发操作。这似乎是一个不错的方法。这是否意味着我还应该在服务器上处理保存文件和运行代码选项?

以及如何让多个用户编辑同一个文件?显然,我不是要一个-real- 代码。我知道互斥量和信号量,但从未实现过。一些伪代码可能会有所帮助?我不知道从哪里开始挖掘所以我在这里。如果有人能给我指明方向,我将不胜感激(任何要阅读的书籍或教程......等)

标签: c++multithreadingqtfileconcurrency

解决方案


看看 QThread 和 Qt Signals/Slots。假设您有一个具有编辑器和保存命令的主程序。这是你的主线。您的保存命令在工作线程中执行,这是一个可以在主线程旁边运行的 QThread 实例。当用户单击保存时,您的工作线程将发送一个 Qt 信号,说明保存命令已执行。然后您的主线程可以刷新文件内容。现在因为您使用 QThread 和 Qt 信号,您将不需要任何互斥量或信号量或任何类型的资源锁定,因为这已经为您完成了。您可以将其视为线程安全的。

以下示例直接取自 Qt 文档:https ://doc.qt.io/qt-5/qthread.html

class Worker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const QString &parameter) {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }

signals:
    void resultReady(const QString &result);
};

class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    Controller() {
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &Controller::operate, worker, &Worker::doWork);
        connect(worker, &Worker::resultReady, this, &Controller::handleResults);
        workerThread.start();
    }
    ~Controller() {
        workerThread.quit();
        workerThread.wait();
    }
public slots:
    void handleResults(const QString &);
signals:
    void operate(const QString &);
};

推荐阅读