本文最后更新于 159 天前,如有失效或谬误请评论区留言。
设计任务
本次项目的目标是设计一个可用于实际工程数据的数据分析处理、信息管理系统,包括实现数据文件的读取、分析、管理,结果可视化,人机交互等。
使用的环境
本次项目基于C++语言,使用Clion作为集成开发环境,项目由CMake配置,可以在VS等IDE中部署编译
文件组成说明
本次项目由如下文件组成:
- main.cpp:程序入口,用于初始化窗口、构造第一个显示的界面和开启监听用户键盘和鼠标输入的线程。
- UserInputHandler.cpp:监听用户键盘和鼠标输入并触发按钮,输入框等控件的对应负责处理交互的函数。
GuiComponents文件夹,包括一系列GUI组件:
- GuiControllers.cpp:可以和用户交互的控件的抽象基类,声明了基本的成员变量和几个虚拟的函数。
- GuiLabel.cpp:不可以和用户交互的静态控件(标签)的抽象基类,声明了基本的成员变量和虚拟的函数。
- GuiScreen.cpp:所有界面类的基类,声明了一个界面的控件列表,定义了几个基本的函数。
- GuiButton.cpp:按钮类。
- GuiInputBox.cpp:输入框类。
- GuiHistogram.cpp:条形图类。
- GuiLineChart.cpp:折线图类。
Entities文件夹,包括几个实体类:
- FileEntity.cpp:用于数据读取和分析时存放文件的数据。
- SavedDataEntity.cpp:用于读取并保存datainfo.dat中存储的文件数据并在信息管理系统使用。
PolyFitUtils文件夹,包括多项式拟合相关的工具:
- polyfit.cpp:对数据进行多项式拟合,高斯消元等操作。
- polyop.cpp:用于多项式函数求值。
Screens文件夹,包括软件需要显示的所有界面:
- WelcomeScreen.cpp:进入程序首先显示的界面,包括登录、注册和退出程序按钮。
- LoginScreen.cpp:登录界面。
- RegisterScreen.cpp:注册界面。
- MainScreen.cpp:登录后进入的界面,包括数据处理系统和信息管理系统两个按钮。
- DataAnalyseScreen.cpp:数据处理系统,允许用户选择需要处理的数据文件,并跳转至处理结果界面。
- DataResScreen.cpp:对数据文件处理的结果,折线图、条形图等在这里显示,允许用户输入拟合阶数等。
- DataManageScreen.cpp:显示已处理的文件的个数,对已处理文件进行删、查。
Processors文件夹,包括软件的主要业务逻辑:
- DataAnalyseSystem.cpp:包括数据处理系统的主要逻辑。
- DataManageSystem.cpp:包括信息管理系统的主要逻辑。
- LifecycleProcessor.cpp:控制程序生命周期的源文件。
- UserAuthentication.cpp:包括用户认证系统的主要逻辑。
除这些源代码文件外,本项目还有:
- data文件夹:存储需要处理和管理的数据文件,若该文件夹缺失,运行程序会自动创建,但数据文件®需要使用者手动加入。
- datainfo.dat:存储信息管理系统存储的信息,若该文件缺失,程序会自动创建。
- userinfo.dat:存储用户信息的文件,若该文件缺失,程序会自动创建。
数据描述
共定义九个类,其中有GUI组件类,业务实体类,在此展示其中的按钮GUI类。
#pragma once
#include "GuiControllers.cpp"
#include "graphics.h"
#include <thread>
class GuiButton : public GuiControllers{
public:
int left; // 左上X坐标
int top; // 左上Y坐标
int right; // 右下X坐标
int bottom;// 右下Y坐标
int text_height; // 文字高度(大小)
COLORREF originColor; //设置的按钮颜色
COLORREF color; // 实际渲染按钮颜色
COLORREF text_color;// 文字颜色
TCHAR text[20]; // 文字内容
// 按钮的构造函数
GuiButton(int left, int top, int right, int bottom, COLORREF color, COLORREF text_color, int text_height,
TCHAR text[20], void (&func)()) {
此处省略赋值过程
}
// 绘制按钮的函数
void drawController() override {
此处省略绘制函数具体实现
}
private:
void (*ButtonProcessor)();// 按钮对应的函数指针
};
项目coding中遇到的问题
遇到的问题
在进行人机交互系统和图形用户界面系统的交互设计时,由于人机交互系统保持对鼠标和键盘信息的高速轮询,图形用户界面系统保持高速渲染程序画面,两个线程之间出现了对共用资源的读写冲突的问题。
解决方法
优化了数据的结构,减少了共用资源的使用量,使用互斥锁保证同一资源在同一时刻只有一个线程在读写。