Russian Qt Forum
Ноябрь 24, 2024, 23:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выбор метода синхронизации рабочих мест  (Прочитано 4228 раз)
ammaximus
Гость
« : Май 14, 2012, 12:55 »

Определенное приложение содержит 2 QVectora с не особо большим количеством элементов. Основой приложения является то, как оно с этими данными обращается - алгоритмы. К рабочей машине подключены устройства вывода, различные специальные устройства, активизирующиеся по результатам работы алгоритмов.
Помимо этого по локальной сети может быть подключена еще одна машина. Ее функции дублируют 1 только в плане отображения данных и управления запуском алгоритмов. Фактически это машина - view, необязательная. Таких машин может быть несколько.
Подскажите наиболее удачный принцип реализации такого ПО, как правильно оформить связь между машинами?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Май 14, 2012, 14:47 »

Не очень понятно о чем Вы спрашиваете Улыбающийся. Ну если "другая машина" (значит др приложение и др адресное пр-во) то придется гнать данные на view (напр через сокеты)
Записан
RealDuke
Гость
« Ответ #2 : Май 18, 2012, 08:29 »

По мне, так проще по UDP броадкастом посылать какие-то данные. Можно целиком, а можно только коды, с последующей трансформацией на стороне приёмника.
Записан
ammaximus
Гость
« Ответ #3 : Август 07, 2012, 21:36 »

Мне интересны способы как можно сделать систему распределенных вычислений, т.е. на обоих машинах выполняется одна задача, разными процессами, но данные должны быть общими.
Я подумал о том, чтобы по завершению записи потоком (завершением считать вызов mutex.unlock) отправлялись данные на другой АРМ. Также определить приоритет обработки данных при одновременном посыле. Также мне нужно обеспечить межпроцессное взаимодействие на одном АРМе, это лучше сделать также сокетами или можно как то сделать мутексированный объект для обмена?
Просто не хочется изобретать велосипед, возможно есть уже проверенные принципы и подходы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 07, 2012, 22:11 »

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

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

Дело в том, что распределение производится не ради ускорения, а ради стабильности системы в случае отказа одного из компонентов. На обоих машинах работают одинаковые алгоритмы, а обмен между ними должен быть четко синхронизирован, чтобы они друг с другом не колизировали.
Мутексы это к тому, что по закрытию мутекса общих данных на локальной машине, я предполагаю, что алгоритм закончил квант записи и можно проводить синхронизацию, ибо думаю посылать по каждой измененной переменной не айс.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 08, 2012, 18:10 »

Мутексы это к тому, что по закрытию мутекса общих данных на локальной машине, ..
Используя стандартные термины "как Вам хочется" Вы остаетесь непонятым
Записан
ammaximus
Гость
« Ответ #7 : Август 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


Писал этот код специально для форума, но получилось все равно много, поэтому остальное во вложении.
« Последнее редактирование: Август 09, 2012, 17:43 от ammaximus » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.