Russian Qt Forum

Qt => Общие вопросы => Тема начата: ammaximus от Май 14, 2012, 12:55



Название: Выбор метода синхронизации рабочих мест
Отправлено: ammaximus от Май 14, 2012, 12:55
Определенное приложение содержит 2 QVectora с не особо большим количеством элементов. Основой приложения является то, как оно с этими данными обращается - алгоритмы. К рабочей машине подключены устройства вывода, различные специальные устройства, активизирующиеся по результатам работы алгоритмов.
Помимо этого по локальной сети может быть подключена еще одна машина. Ее функции дублируют 1 только в плане отображения данных и управления запуском алгоритмов. Фактически это машина - view, необязательная. Таких машин может быть несколько.
Подскажите наиболее удачный принцип реализации такого ПО, как правильно оформить связь между машинами?


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: Igors от Май 14, 2012, 14:47
Не очень понятно о чем Вы спрашиваете :). Ну если "другая машина" (значит др приложение и др адресное пр-во) то придется гнать данные на view (напр через сокеты)


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: RealDuke от Май 18, 2012, 08:29
По мне, так проще по UDP броадкастом посылать какие-то данные. Можно целиком, а можно только коды, с последующей трансформацией на стороне приёмника.


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: ammaximus от Август 07, 2012, 21:36
Мне интересны способы как можно сделать систему распределенных вычислений, т.е. на обоих машинах выполняется одна задача, разными процессами, но данные должны быть общими.
Я подумал о том, чтобы по завершению записи потоком (завершением считать вызов mutex.unlock) отправлялись данные на другой АРМ. Также определить приоритет обработки данных при одновременном посыле. Также мне нужно обеспечить межпроцессное взаимодействие на одном АРМе, это лучше сделать также сокетами или можно как то сделать мутексированный объект для обмена?
Просто не хочется изобретать велосипед, возможно есть уже проверенные принципы и подходы.


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: Igors от Август 07, 2012, 22:11
Мне интересны способы как можно сделать систему распределенных вычислений, т.е. на обоих машинах выполняется одна задача, разными процессами, но данные должны быть общими.
Строго говоря "общими" они быть не могут, на каждой машине должна быть своя, локальная копия данных, это нормально.

Я подумал о том, чтобы по завершению записи потоком (завершением считать вызов mutex.unlock) отправлялись данные на другой АРМ. Также определить приоритет обработки данных при одновременном посыле. Также мне нужно обеспечить межпроцессное взаимодействие на одном АРМе, это лучше сделать также сокетами или можно как то сделать мутексированный объект для обмена?
Просто не хочется изобретать велосипед, возможно есть уже проверенные принципы и подходы.
Все мутексы работают "в пределах одной машины", поэтому упоминание о них непонятно. Обычный подход - делить задачу на куски. Напр нужно посчитать большой имедж. Первая машина считает первую тысячу строк имеджа, вторая вторую и.т.д. Какое-то приложение-менеджер управляет считающими посылая им порции работы через сокеты. В общем, забот там хватает.


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: ammaximus от Август 08, 2012, 13:59
Дело в том, что распределение производится не ради ускорения, а ради стабильности системы в случае отказа одного из компонентов. На обоих машинах работают одинаковые алгоритмы, а обмен между ними должен быть четко синхронизирован, чтобы они друг с другом не колизировали.
Мутексы это к тому, что по закрытию мутекса общих данных на локальной машине, я предполагаю, что алгоритм закончил квант записи и можно проводить синхронизацию, ибо думаю посылать по каждой измененной переменной не айс.


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: Igors от Август 08, 2012, 18:10
Мутексы это к тому, что по закрытию мутекса общих данных на локальной машине, ..
Используя стандартные термины "как Вам хочется" Вы остаетесь непонятым


Название: Re: Выбор метода синхронизации рабочих мест
Отправлено: ammaximus от Август 09, 2012, 17:38
Да, есть такая проблема, но это не из-за невежества, скорее недостатка опыта  :)
Попробую объяснить наглядно.
Код:
#ifndef COMMONDATA_H
#define COMMONDATA_H

#include <QObject>
#include <QVector>
#include <QUdpSocket>
#include <QMutex>
#include <QMessageBox>

#include "owntype.h"

class CommonData : public QObject // Массив общих данных
{
Q_OBJECT
public:
    explicit CommonData(int port, QObject *parent = 0);

    QVector<OwnType*>::iterator begin();
    QVector<OwnType*>::iterator end();
    OwnType* operator[](int);                                // Перегрузка оператора индексации

signals:

public slots:

    int add(int);                                           // Создание по номеру (если существует - вернет 1)
    int add(OwnType*);                                      // Добавление элемента в массив (если существует - вернет 1)
    int del(int);                                           // Удаление по номеру (если неудачно - вернет 1)
    int del(OwnType*);                                      // Удаление по элементу (отождествление, если неудачно - вернет 1)
    OwnType* find(int);                                      // Поиск по номеру
    OwnType* find(OwnType*);                                 // Поиск по элементу (отождествление)
    void printDebug();
    int size();
    void setSendPort(int port);

private slots:
    void getChanged();
    void sendChanges(OwnType*);

protected:
    bool findPos(int, QVector<OwnType*>::iterator &);       // Поиск номера элемента массива (по номеру)
    bool findPos(OwnType*, QVector<OwnType*>::iterator &);  // Поиск номера элемента массива (по элементу)
    int copy(OwnType*,OwnType*);

protected:
    void processDatagramm(QByteArray datagramm);

    QVector<OwnType*> commonVector;
    QMutex mutex;

    QUdpSocket *armSyncSend;
    QUdpSocket *armSyncGet;
    int sendPort;
    int ownPort;
};

#endif // COMMONDATA_H

Это объект данных, который один для всех алгоритмов на каждой машине, но на разных машинах и объекты разные, поэтому их надо синхронизировать, ибо я хочу чтобы они работали сообща.

Код:
#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <QThread>
#include "commondata.h"

class Algorithm : public QThread
{
    Q_OBJECT
public:
    Algorithm(int port);
    CommonData *data;

    void run();

public slots:
    void change(int,QString);
    void setPartnerPort(int);
};

#endif // ALGORITHM_H

Это алгоритм. Для имитации разных машин я использую потоки и связываю их UDP.
Код:
#ifndef RULEFORM_H
#define RULEFORM_H

#include "ui_ruleform.h"

#include "algorithm.h"
#include <QTimer>

class RuleForm : public QWidget, private Ui::RuleForm {
    Q_OBJECT
public:
    RuleForm(QWidget *parent = 0);
public slots:
    void set1_2();
    void set2_1();
    void refresh();

signals:
    void emitSignal1(int, QString);
    void emitSignal2(int, QString);

protected:
    Algorithm *alg1;
    Algorithm *alg2;
    void changeEvent(QEvent *e);
};

#endif // RULEFORM_H


Писал этот код специально для форума, но получилось все равно много, поэтому остальное во вложении.