目录

背景

实践环境

逻辑结构图

运行截图

数据展示进程源码

服务进程(插件调用)源码

插件源码

MySQL相关


背景

工作一年零1个月了(加上实习),靠着工作中学到的东西,花了周末2天时间,做了一个小系统,这个小系统中有2个进程,一个是用于数据展示的进程。

另外一个进程是用来调取Qt插件,这个插件可能连接了Mysql,也可能连接了SQLSever等数据库,调用插件后,读取插件返回的数据库的数据;

展示软件通过设置一个描述字符串,这个字符串可以是检索Mysql的语句!

把展示软件的描述字符串内容和这个字符串的ID,通过共享内存的方式给插件调用端,插件调用端是一个中转,把数据给对应的插件。获得了数据后!

再使用共享内存的方式给数据展示进程!

实践环境

语言有C++,和SQL,

其中C++使用Qt框架(Qt Creator 5.7作为IDE,编译器为MinGw)

数据库使用的是Mysql数据库;

逻辑结构图

所以本次实践涉及3个程序,一个是数据展示进程,一个是服务进程(提供展示数据),一个是插件

运行截图

话不多说,先看动态演示!

添加很多展示数据后!

拖动动态数据:

设置描述符后:

上面设置的描述符为:

select value from sourcenetload.datasample where idval=6

以上的数据都是从数据库中读取的!

这里数据改变的原因是,我在Mysql中写了一个存储过程,这个存储过程能修改表中所有数据,

用写了一个事件,每秒进行调用,下面将会详细给出!

服务进程中转站截图:

插件端

数据展示进程源码

程序结构如下:

dynamicdata.h

#ifndef DYNAMICDATA_H
#define DYNAMICDATA_H#include <QGraphicsItem>class DynamicData : public QGraphicsItem
{
public:DynamicData();~DynamicData();QRectF boundingRect()const Q_DECL_OVERRIDE;void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) Q_DECL_OVERRIDE;int getId();void setId(const int &id);QString getText();void setText(const QString &str);QString getDescrib();void setDescrib(const QString &str);private:int m_id;QString m_text;QString m_describ;
};#endif // DYNAMICDATA_H

mygraphicsscene.h

#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H#include <QObject>
#include <QPointF>
#include <QGraphicsView>class MyGraphicsScene : public QGraphicsScene
{Q_OBJECT
public:MyGraphicsScene(QWidget *parent = 0);~MyGraphicsScene();void createDynamicData(const QPointF &pt, const int &id);protected:void dragEnterEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;void dropEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;void dragMoveEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
};#endif // MYGRAPHICSSCENE_H

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H#include <QObject>
#include <QGraphicsView>class MyGraphicsView : public QGraphicsView
{Q_OBJECT
public:MyGraphicsView(QWidget *parent = 0);~MyGraphicsView();protected:void dragEnterEvent(QDragEnterEvent *event) Q_DECL_OVERRIDE;void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE;private:int m_count;
};#endif // MYGRAPHICSVIEW_H

mylistwidget.h

#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H#include <QObject>
#include <QListWidget>class MyListWidget : public QListWidget
{Q_OBJECT
public:MyListWidget(QWidget *parent = 0);~MyListWidget();protected:void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;private:QPoint m_dragPosition;QListWidgetItem *m_dragItem;
};#endif // MYLISTWIDGET_H

setdatadialog.h

#ifndef SETDATADIALOG_H
#define SETDATADIALOG_H#include <QDialog>namespace Ui {
class setDataDialog;
}class setDataDialog : public QDialog
{Q_OBJECTpublic:explicit setDataDialog(QWidget *parent = 0, const int &id = -1, const QString &str = "NULL");~setDataDialog();QString getDescrib();protected slots:void okBtnClicked();void cancelBtnClicked();private:Ui::setDataDialog *ui;
};#endif // SETDATADIALOG_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QSharedMemory;
class QTimer;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void shareMemoryTimeout();private:Ui::Widget *ui;QSharedMemory *m_sharedMemory;QSharedMemory *m_sharedMemory2;QTimer *m_timer;
};#endif // WIDGET_H

dynamicdata.cpp

#include "dynamicdata.h"
#include <QPainter>
#include <QDebug>
#include <QBrush>
#include <QMessageBox>DynamicData::DynamicData()
{m_text = "-123456789";m_describ = "NULL";
}DynamicData::~DynamicData()
{}QRectF DynamicData::boundingRect() const
{qreal penWidth = 1;return QRectF(0 - penWidth / 2, 0 - penWidth / 2, 80 + penWidth, 10 + penWidth);
}void DynamicData::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{Q_UNUSED(option)Q_UNUSED(widget)painter->setBrush(Qt::red);painter->drawText(0, 0, 80, 10, Qt::AlignCenter, m_text);
}int DynamicData::getId()
{return m_id;
}void DynamicData::setId(const int &id)
{m_id = id;
}QString DynamicData::getText()
{return m_text;
}void DynamicData::setText(const QString &str)
{m_text = str;update();
}QString DynamicData::getDescrib()
{return m_describ;
}void DynamicData::setDescrib(const QString &str)
{m_describ = str;
}

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

mygraphicsscene.cpp

#include "mygraphicsscene.h"
#include "dynamicdata.h"
#include "setdatadialog.h"
#include <QDebug>
#include <QMimeData>
#include <QPen>
#include <QMessageBox>
#include <QGraphicsSceneDragDropEvent>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QTransform>
#include <QDragMoveEvent>MyGraphicsScene::MyGraphicsScene(QWidget *parent) : QGraphicsScene(parent)
{}MyGraphicsScene::~MyGraphicsScene()
{}void MyGraphicsScene::createDynamicData(const QPointF &pt, const int &id)
{DynamicData *item = new DynamicData;item->setPos(pt);item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);item->setId(id);addItem(item);
}void MyGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{if(event->mimeData()->hasFormat("text/plain")){event->acceptProposedAction();}
}void MyGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{QGraphicsScene::dropEvent(event);
}void MyGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{event->accept();
}void MyGraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{QTransform deviceTransform;DynamicData* item = static_cast<DynamicData*>(itemAt(event->scenePos(), deviceTransform));if(item != NULL){setDataDialog *msetDataDialog = new setDataDialog(NULL, item->getId(), item->getDescrib());if(msetDataDialog->exec() == QDialog::Accepted){item->setDescrib(msetDataDialog->getDescrib());}delete msetDataDialog;}QGraphicsScene::mousePressEvent(event);
}

mygraphicsview.cpp

#include "mygraphicsview.h"
#include "mygraphicsscene.h"
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QDebug>MyGraphicsView::MyGraphicsView(QWidget *parent) : QGraphicsView(parent)
{MyGraphicsScene *scene = new MyGraphicsScene;scene->setSceneRect(-1000, -1000, 1000, 1000);setScene(scene);m_count = 0;
}MyGraphicsView::~MyGraphicsView()
{}void MyGraphicsView::dragEnterEvent(QDragEnterEvent *event)
{if(event->mimeData()->hasFormat("text/plain")){event->acceptProposedAction();}QGraphicsView::dragEnterEvent(event);
}void MyGraphicsView::dropEvent(QDropEvent *event)
{if(event->mimeData()->hasFormat("text/plain")){MyGraphicsScene *scene = (MyGraphicsScene*)this->scene();scene->createDynamicData(mapToScene(event->pos()), m_count++);event->acceptProposedAction();}QGraphicsView::dropEvent(event);
}

mylistwidget.cpp

#include "mylistwidget.h"
#include <QMouseEvent>
#include <QListWidgetItem>
#include <QDrag>
#include <QMimeData>
#include <QPainter>
#include <QApplication>
#include <QPixmap>MyListWidget::MyListWidget(QWidget *parent) : QListWidget(parent)
{}MyListWidget::~MyListWidget()
{}void MyListWidget::mouseMoveEvent(QMouseEvent *event)
{if(!(event->buttons() & Qt::LeftButton))return;if((event->pos() - m_dragPosition).manhattanLength() < QApplication::startDragDistance())return;if(!m_dragItem)return;QDrag *drag = new QDrag(this);QMimeData *mimeData = new QMimeData;mimeData->setText(currentItem()->text());drag->setMimeData(mimeData);if(mimeData->text() == "动态数据"){QPixmap dragImg(100, 50);QPainter painter(&dragImg);painter.setBrush(QBrush(Qt::red));painter.drawRect(0, 0, 100, 50);drag->setPixmap(dragImg);}drag->exec(Qt::CopyAction|Qt::MoveAction);
}void MyListWidget::mousePressEvent(QMouseEvent *event)
{m_dragPosition=event->pos();m_dragItem=this->itemAt(event->pos());QListWidget::mousePressEvent(event);}

setdatadialog.cpp

#include "setdatadialog.h"
#include "ui_setdatadialog.h"setDataDialog::setDataDialog(QWidget *parent, const int &id, const QString &str) :QDialog(parent),ui(new Ui::setDataDialog)
{ui->setupUi(this);this->setWindowTitle("CSDN IT1995设置描述符号");ui->idLineEdit->setText(QString::number(id));ui->idLineEdit->setEnabled(false);ui->describLineEdit->setText(str);connect(ui->okPushButton, SIGNAL(clicked(bool)), this, SLOT(okBtnClicked()));connect(ui->cancelPushButton, SIGNAL(clicked(bool)), this, SLOT(cancelBtnClicked()));
}setDataDialog::~setDataDialog()
{delete ui;
}QString setDataDialog::getDescrib()
{return ui->describLineEdit->text();
}void setDataDialog::okBtnClicked()
{accept();
}void setDataDialog::cancelBtnClicked()
{reject();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "dynamicdata.h"
#include <QSharedMemory>
#include <QGraphicsItem>
#include <QTImer>
#include <QDebug>
#include <QDataStream>
#include <QBuffer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("CSDN IT1995");ui->listWidget->insertItem(0, "动态数据");m_sharedMemory = new QSharedMemory("CSDN IT1995");m_sharedMemory2 = new QSharedMemory(this);m_sharedMemory2->setKey("5991TI NDSC");m_timer = new QTimer(this);connect(m_timer, SIGNAL(timeout()), this, SLOT(shareMemoryTimeout()));m_timer->start(500);
}Widget::~Widget()
{delete ui;
}//这里我偷懒了,应该要抽2-3个函数出来的。
void Widget::shareMemoryTimeout()
{//偷懒了QList<QGraphicsItem *> list = ui->graphicsView->items();if(list.isEmpty())return;if(m_sharedMemory->isAttached()){if(!m_sharedMemory->detach()){return;}}QString str;foreach(QGraphicsItem *item, list){int id = static_cast<DynamicData*>(item)->getId();QString describ = static_cast<DynamicData*>(item)->getDescrib();str.append(QString::number(id) + ";" + describ + "#");}str = str.left(str.length() - 1);QBuffer buffer;buffer.open(QBuffer::ReadWrite);QDataStream out(&buffer);out << str;if(!m_sharedMemory->create(buffer.size())){qDebug() << "create failed!";return;}m_sharedMemory->lock();char *to = static_cast<char*>(m_sharedMemory->data());memcpy(to, str.toStdString().c_str(), (int)buffer.size());m_sharedMemory->unlock();//获取数据 偷懒了if(!m_sharedMemory2->attach()){return;}QBuffer buffer2;m_sharedMemory2->lock();buffer2.setData((char*)m_sharedMemory2->constData(), m_sharedMemory2->size());buffer2.open(QBuffer::ReadOnly);QString data2 = buffer2.readAll();m_sharedMemory2->unlock();m_sharedMemory2->detach();//设置item的值 偷懒了QStringList listData = data2.split("#");listData.removeLast();qDebug() << listData;for(int i = 0; i < listData.size(); i++){QStringList idList = listData[i].split(";");foreach(QGraphicsItem *item, list){int id = static_cast<DynamicData*>(item)->getId();if(id == idList[0].toInt()){static_cast<DynamicData*>(item)->setText(idList[1]);ui->graphicsView->update();}}}
}

setdatadialog.ui

widget.ui

服务进程(插件调用)源码

程序结构如下:

appinterface.h

#ifndef APPINTERFACE_H
#define APPINTERFACE_H#include <QObject>class AppInterface{public:virtual ~AppInterface(){}virtual QString name() = 0;virtual QWidget *widget() = 0;virtual void setSQLData(const QString &cmdData){ Q_UNUSED(cmdData); }virtual QString getSQLData(){ return""; }QString libDir(){return m_libDir.isEmpty() ? "./" : m_libDir;}void setLibDir(const QString &libDir){m_libDir = libDir;}private:QString m_libDir;};QT_BEGIN_NAMESPACE#define Interface_iid "com.IT1995.Interface"
Q_DECLARE_INTERFACE(AppInterface, Interface_iid)QT_END_NAMESPACE#endif // APPINTERFACE_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMap>namespace Ui {
class Widget;
}QT_BEGIN_NAMESPACE
class QSharedMemory;
QT_END_NAMESPACEclass AppInterface;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);void readPlugin();~Widget();protected:void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;void setMap(const QString &data);private:Ui::Widget *ui;QSharedMemory *m_sharedMemory;QSharedMemory *m_sharedMemory2;int m_timerId;int m_timerId2;QMap<int, QString> m_map;QList<AppInterface*> m_widgetList;QString m_sendMsg;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "appinterface.h"
#include <QDir>
#include <QPluginLoader>
#include <QMessageBox>
#include <QSharedMemory>
#include <QDebug>
#include <QDataStream>
#include <QBuffer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("CSDN IT1995中转站");m_sharedMemory = new QSharedMemory(this);m_sharedMemory2 = new QSharedMemory(this);m_sharedMemory->setKey("CSDN IT1995");m_sharedMemory2->setKey("5991TI NDSC");m_timerId = startTimer(500);m_timerId2 = startTimer(500);m_sendMsg = "";readPlugin();
}void Widget::readPlugin()
{QDir pluginsDir(qApp->applicationDirPath() + "/plugin");foreach(QString filename, pluginsDir.entryList(QDir::Files)){QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(filename));QObject *plugin = pluginLoader.instance();if(plugin){AppInterface *app = qobject_cast<AppInterface*>(plugin);if(app){m_widgetList.append(app);}}}if(m_widgetList.isEmpty()){QMessageBox::warning(this, "warning", "load plugin error");}else{foreach(AppInterface *w, m_widgetList){w->widget();qDebug() << w->name();}}
}Widget::~Widget()
{delete ui;
}void Widget::timerEvent(QTimerEvent *event)
{if(event->timerId() == m_timerId2){QBuffer buffer;buffer.open(QBuffer::ReadWrite);QDataStream out(&buffer);out << m_sendMsg;if(!m_sharedMemory2->create(buffer.size())){qDebug() << "create failed!";return;}m_sharedMemory2->lock();char *to = static_cast<char*>(m_sharedMemory2->data());memcpy(to, m_sendMsg.toStdString().c_str(), (int)buffer.size());m_sharedMemory2->unlock();}else if(event->timerId() == m_timerId){if(!m_sharedMemory->attach()){return;}QBuffer buffer;m_sharedMemory->lock();buffer.setData((char*)m_sharedMemory->constData(), m_sharedMemory->size());buffer.open(QBuffer::ReadOnly);QString data = buffer.readAll();m_sharedMemory->unlock();m_sharedMemory->detach();setMap(data);//qDebug() << data;//获取数据m_sendMsg.clear();foreach(AppInterface *w, m_widgetList){QList<int> mapList = m_map.keys();for(int i = 0; i < mapList.size(); i++){w->setSQLData(m_map.value(mapList[i]));m_sendMsg.append(QString::number(mapList[i]) + ";" + w->getSQLData() + "#");}}m_sendMsg.left(m_sendMsg.size() - 1);qDebug() << m_sendMsg;}
}void Widget::setMap(const QString &data)
{QStringList list = data.split("#");for(int i = 0; i < list.size(); i++){QStringList singleList = list[i].split(";");m_map.insert(singleList[0].toInt(), singleList[1]);}
}

widget.ui

插件源码

程序结构如下:

这个插件主要是用于读取Mysql

appinterface.h

#ifndef APPINTERFACE_H
#define APPINTERFACE_H#include <QObject>class AppInterface{public:virtual ~AppInterface(){}virtual QString name() = 0;virtual QWidget *widget() = 0;virtual void setSQLData(const QString &cmdData){ Q_UNUSED(cmdData); }virtual QString getSQLData(){ return""; }QString libDir(){return m_libDir.isEmpty() ? "./" : m_libDir;}void setLibDir(const QString &libDir){m_libDir = libDir;}private:QString m_libDir;};QT_BEGIN_NAMESPACE#define Interface_iid "com.IT1995.Interface"
Q_DECLARE_INTERFACE(AppInterface, Interface_iid)QT_END_NAMESPACE#endif // APPINTERFACE_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);void setData(const QString &cmdData);QString getData();~Widget();protected:bool connectMySQL();QString getSqlData(const QString &cmd);private:Ui::Widget *ui;QSqlDatabase m_db;QString m_cmd;
};#endif // WIDGET_H

widgetplugin.h

#ifndef WIDGETPLUGIN_H
#define WIDGETPLUGIN_H#include <QObject>
#include "appinterface.h"
#include "widget.h"class WidgetPlugin : public QObject, AppInterface
{Q_OBJECTQ_PLUGIN_METADATA(IID "com.IT1995.Interface")Q_INTERFACES(AppInterface)public:QString name(){ return QStringLiteral("MySQL插件");}QWidget *widget(){m_widget = new Widget();return m_widget;}void setSQLData(const QString &cmdData){m_widget->setData(cmdData);}virtual QString getSQLData(){return m_widget->getData();}private:Widget *m_widget;
};#endif // WIDGETPLUGIN_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QSqlQuery>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);if(!connectMySQL()){//QMessageBox::information(this, "tip", "连接Mysql数据库失败");return;}//QMessageBox::information(this, "tip", "连接Mysql数据库成功");
}void Widget::setData(const QString &cmdData)
{m_cmd = cmdData;
}QString Widget::getData()
{return getSqlData(m_cmd);
}Widget::~Widget()
{delete ui;
}bool Widget::connectMySQL()
{m_db = QSqlDatabase::addDatabase("QMYSQL");m_db.setHostName("127.0.0.1");m_db.setPort(3306);m_db.setDatabaseName("mysql");m_db.setUserName("root");m_db.setPassword("root");if(!m_db.open()){qDebug() << "error";return false;}return true;
}QString Widget::getSqlData(const QString &cmd)
{QSqlQuery query;if(!query.exec(cmd) || query.size() <= 0){return "-1234567890";}while(query.next()){//理论只有一条return query.value(0).toString();}return "-1234567890";
}

widget.ui

这个ui里面没东西

MySQL相关

mysql存储过程,表结构,事件已经在下面的博文中给出了,在此不再详细说明:

MySQL工作笔记-使用事件和存储过程定时更新某表数据

https://blog.csdn.net/qq78442761/article/details/88597665

系统架构工作笔记-数据展示进程与读取数据进程分离,实现低耦合(展示软件可适用任意厂家数据库)相关推荐

  1. 系统架构师----笔记

    计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件资格考试),是国家人力资源和社会保障部.工业和信息化部联合组织实施的国家级考试,其目的是科学.公正地对全国计算机与软件专业技术人员进行职业资 ...

  2. 系统架构设计笔记(46)—— 面向服务的架构

    迄今为止,对于面向服务的架构( Service-Oriented Architecture , SOA )还没有一个公认的定义.许多组织从不同的角度和不同的侧面对 SOA 进行了描述,较为典型的有以下 ...

  3. 软考系统架构师笔记-最后知识点总结(三)

    ATAM中文名:体系结构权衡分析方法,他最后的目标是生成关键的质量属性效用树. 在软考中,体系结构=架构 体系结构权衡方法(ATAM)包含4个主要的领域活动:场景和需求收集.体系结构视图和场景实现.属 ...

  4. 系统架构设计笔记(35)—— 结构化分析与设计

    结构化分析与设计方法是一种面向数据流的需求分析和设计方法,它适用于分析和设计大型数据处理系统,是一种简单 . 实用的方法,曾获得广泛的应用. 1 结构化分析 结构化分析方法的基本思想是自顶向下逐层分解 ...

  5. 系统架构设计笔记(15)—— 网络架构与协议

    网络架构是指计算机网络的各层及其协议的集合.计算机之间要交换数据,就必须遵守一些事先约定好的规则,用于规定信息的格式及如何发送和接收信息的一套规则就称为网络协议.为了减少网络协议设计的复杂性,网络设计 ...

  6. 系统架构师笔记——计算机网络

    本章要求考生掌握以下知识点: (1)信息系统综合知识:包括数据通信的基础知识.开放系统互连参考模型.常用的协议标 准.网络互连与常用网络设备.计算机网络的分类与应用.网络管理. (2)系统架构设计案例 ...

  7. 系统架构设计笔记(59)—— 嵌入式系统的组成

    嵌入式系统一般都由软件和硬件两个部分组成,其中嵌入式处理器 . 存储器和外部设备构成整个系统的硬件基础. 嵌入式系统的软件部分可以分为3个层次:系统软件 . 应用支撑软件和应用软件.其中,系统软件和支 ...

  8. 系统架构设计笔记(64)—— 嵌入式系统设计

    嵌入式系统设计的主要任务是定义系统的功能 . 决定系统的架构,并将功能映射到系统实现架构上.这里,系统架构既包括软件系统架构也包括硬件系统架构.一种架构可以映射到各种不同的物理实现,每种实现表示不同的 ...

  9. 软考系统架构师笔记-最后知识点总结(二)

    系统架构的风险点:在系统架构设计中潜在的,有问题的架构决策所带来的隐患: 系统架构的敏感点:为了实现某种特定的质量属性,一个或多个构件所具有的特征: 系统架构的权衡点:影响多个质量属性的特性,是多个质 ...

最新文章

  1. SQL0332N 不支持从源代码页 XXXX 到目标代码页 XXXX
  2. python列表删除指定字典_Python:从列表中删除字典
  3. hdu4920 矩阵乘法%3
  4. 【Qt】Qt中QJsonObject类
  5. BZOJ2038: [2009国家集训队]小Z的袜子(hose)
  6. 如何查找android emulator内核的精确版本
  7. 深度学习入门笔记(五):神经网络的学习
  8. Python 爬虫分析豆瓣 TOP250 告诉你程序员业余该看什么书?
  9. 快讯:阿里巴巴加入JCP执行委员会
  10. linux下图形远程桌面
  11. Java修饰符的访问权限
  12. 文字和表单(checkbox/radio)元素垂直对齐方法,兼容Firefox和IE。
  13. CSV 文件中的字段中的开头和结尾上,可能会存在空格或制表符,但是该如何处理呢?
  14. sklearn学习之LR算法实践
  15. 联想微型计算机u盘启动,联想ThinkCentre一体机如何设置U盘启动_联想ThinkCentre电脑怎样从USB启动...
  16. 赏析角度有哪些_从哪些角度赏析句子
  17. 互联网系统故障应急处理流程
  18. 产品工作_技术与产品的异同
  19. opencv项目7---智能识别二维码和条形码
  20. 从零开始在 FreeNAS 的 Jail 上安装 NextCloud 并配置 Nginx 作为网页服务器而且 设置SSL证书 使用 https 访问 以及 oc_filecache 修复方法、优化方法

热门文章

  1. Linux下获取CPUID、硬盘序列号与MAC地址
  2. 从BI到OLAP,数据仓库最终到底能干什么?
  3. 【小点点】上架了他们的官方Windows 8应用
  4. FreeEIM通讯软件平均需要5分钟才能
  5. 根据url提取网站域名的方法小结
  6. (⊙o⊙) 这个头条也坐不住了?
  7. 支付宝小程序面向个人开发者公测
  8. 今日测试:javascript笔试最常见的一道题
  9. 台式计算机内存是什么意思,电脑提示计算机内存不足是什么意思
  10. SQL | 目录(持续更新)