Как реализовать одновременное редактирование файла / текста с помощью c ++? - PullRequest
0 голосов
/ 19 октября 2019

Я работаю над небольшим проектом с Qt (для изучения Qt и небольшим количеством упражнений на c ++), и я хочу достичь клона «онлайн-редакторов кодирования», которые несколько пользователей могут читать и редактировать документ. Не обязательно быть в сети, главное назначение - одновременное редактирование файлов. Я просто не знаю, как подойти к этой задаче.

То, что я до сих пор делал, - это создание простого текстового редактора. Программа имеет две текстовые области. В текстовой области 1 вы пишете свой код. В текстовой области 2 отображается результат. Когда вы запускаете свой код, он сохраняет содержимое текстовой области 1 в файл (например, Code.cpp), а затем компилирует сохраненный файл. Когда он скомпилирован, другая функция запускает исполняемый файл и записывает вывод в другой файл (это делается с помощью команды PowerShell Out-File). Текстовая область 2 просто читает содержимое выходного файла.

Для одного пользователя это работает. Проблема в том, что я не знаю, как справиться с несколькими пользователями. Кто-то предложил мне использовать программу текстового редактора в качестве клиента и обрабатывать параллельные операции на сервере. Это похоже на хороший подход. Означает ли это, что я должен также обрабатывать файл сохранения и запускать код на сервере?

И как мне разрешить нескольким пользователям редактировать один и тот же файл? Очевидно, я не прошу -реальный код. Я знаю мьютексы и семафоры, но никогда не реализовывал их. Может, какой-то псевдокод может помочь? Я не знаю, с чего начать копать, поэтому я здесь. Я был бы очень признателен, если бы кто-нибудь указал мне направление (любые книги для чтения или учебники ... и т. Д.)

1 Ответ

0 голосов
/ 21 октября 2019

Посмотрите на QThread и Qt Сигналы / Слоты. Допустим, у вас есть основная программа, в которой есть редактор и команда сохранения. Это ваша основная тема. Ваша команда сохранения выполняется в рабочем потоке, экземпляре 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 &);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...