c++ - 如何使用 C++ 实现并发文件/文本编辑?
问题描述
我正在开发一个带有 Qt 的小项目(用于学习 Qt 和一些 c++ 练习),我想要实现的是多个用户可以阅读和编辑文档的“在线编码编辑器”的克隆。不必在线,主要目的是处理并发文件编辑。我只是不知道如何处理这项任务。
到目前为止,我所做的是构建一个简单的文本编辑器。程序有两个文本区域。在文本区域 1 中,您编写代码。在文本区域 2 中显示输出。当您运行代码时,它将文本区域 1 的内容保存到文件(例如 Code.cpp)中,然后编译保存的文件。编译后,另一个函数运行 exe 并将输出写入另一个文件(这在 powershell 的 Out-File 命令中完成)。文本区 2 只是读取输出文件的内容。
对于单个用户,这有效。问题是当有多个用户时我不知道如何处理。有人建议我应该使用文本编辑器程序作为客户端并在服务器中处理并发操作。这似乎是一个不错的方法。这是否意味着我还应该在服务器上处理保存文件和运行代码选项?
以及如何让多个用户编辑同一个文件?显然,我不是要一个-real- 代码。我知道互斥量和信号量,但从未实现过。一些伪代码可能会有所帮助?我不知道从哪里开始挖掘所以我在这里。如果有人能给我指明方向,我将不胜感激(任何要阅读的书籍或教程......等)
解决方案
看看 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 ¶meter) {
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 &);
};
推荐阅读
- android - 如何处理返回 null 的 FirebaseInstanceId.getToken()
- javascript - 从另一个 JS 库加载 JS 库,并让页面使用它
- ios - 如何动态更改应用启动器图标
- operating-system - 使用信号量的停车服务员
- javascript - 我的 node.js 用户注册不适用于“/auth/registration”,但适用于“/registration”
- sql - 为什么 NoSQL 数据库不支持即席查询
- oracle - Oracle APEX 应用程序包中匿名块的执行点
- python - Python 用列表中特定索引处的类包装并返回整个列表
- image - 多页 Tiff 的图像质量
- python - AttributeError:“ProgbarLogger”对象没有属性“log_values”