【问题标题】:How to implement concurrent file/text edit with c++?如何使用 C++ 实现并发文件/文本编辑?
【发布时间】:2019-10-18 22:57:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 令人难以置信的广泛主题。如果没有至少并发的基本知识,您将无法完成此任务。我建议从一些简单的事情开始,比如制作一个线程安全的字符串,这样你就可以开始熟悉你需要处理的问题。从那里只会变得更丑。

标签: c++ multithreading qt file concurrency


【解决方案1】:

看看 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 &);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多