请教大家一个关于软件构架的问题:单文档Ribbon界面、数据库、UDP通信、界面图形显示、多线程后台运算

ysysbaobei 2012-04-01 10:11:29
请教大家一个关于软件构架的问题,做一个管理软件,对终端设备进行管理控制,设备通过网络传送UDP数据上来,
数据量比较大,对数据需要进行一系列运算处理,希望能软件架构能合理一点,高效运行。

程序包含以下要素:
1、vc2010开发的mfc单文档应用程序,采用了Ribbon界面风格
2、sql server2000数据库(对数据库的操作随时随地进行,有数据就存储,需要数据就提取)
3、UDP通信收发数据(在MainFrm.cpp里通过回调函数的方式使用)
4、对UDP数据进行后台运算(在View类中进行,开了一个线程专门处理)
5、View界面图形显示(View类)

我现在,将UDP通信收发数据放在了MainFrm.cpp类中,收到数据进行解析,将设备参数存入数据库,
并发送消息到View类进行图形显示更新和复杂的后台计算。
请教大家:
1、如何设计更高效、合理?比如数据收发、数据后台运算处理放在什么类中更合理?
2、我对数据库的操作是在代码中:需要插入就插入,需要更新就更新,需要删除就删除,需要查询就查询,
如何安排更好? 数据库为1个文件,包含多个表;不设计一个操作策略效率很低吧?
3、在.cpp类,即theApp下定义了上百个成员变量,用theApp.bFlag这种方式在程序各个类中频繁使用,这样
是否存在问题?有没更好的解决办法?
4、MainFrm和View类通信,采用了SendMessage的方式;MainFrm和View类应各自包含什么功能?

请大家对包含“单文档Ribbon界面、数据库、UDP通信、界面图形显示、多线程后台运算”的界面架构提供一些看法~~~
...全文
217 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysysbaobei 2012-05-22
  • 打赏
  • 举报
回复
谢谢楼上各位,结贴了
songsu 2012-04-28
  • 打赏
  • 举报
回复
数据库我用的是Xproer.OleDb这个类库,以.Net风格封装的,写起代码来像堆积木一样简单。
下面是使用Xproer.OleDb对数据库进行操作的示例:

#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

//获取DataTable的示例
void ADODataTable(OleDbCommand& cmd)
{
int count = 0;
cmd.ExecuteScalar(L"select count(*) from xdb_news",count);
auto_ptr<DataTable> table;
table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news"));

size_t rowCount = table->GetRowsCount();
for (int i = 0 ; i < rowCount ; ++i)
{
DataRow* row = table->GetRow(i);
DataValue* val = row->GetCel(0);

printf("时间:%d \r\n", val->ToBoolean() );
}
}

//使用OleDbDataReader快速读取数据的示例
void ADORead(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
USES_CONVERSION;
wstring title;
while(r->Read())
{
//r->GetString(0,title);
//printf("标题:%s \r\n",W2A(title.c_str()));
printf("ID:%f \r\n", r->GetFloat(0) );
}
r->Close();
}

//通过变量向数据库安全添加数据的示例
void ADOAdd(OleDbCommand& cmd)
{
cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");
cmd.AddDoubleParam(L"@VDouble",125022.3180);

cmd.ExecuteNonQuery();
}

//高性能向数据库插入数据的示例
void ADOParam(OleDbCommand& cmd)
{
cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");
cmd.AddInt32Param(L"@ID",886);
cmd.SetPrepared(true);

_variant_t index = (short)0;
_ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);
param->Value = 887;
cmd.ExecuteNonQuery();
param->Value = 888;
cmd.ExecuteNonQuery();
param->Value = 889;
cmd.ExecuteNonQuery();
param->Value = 890;
cmd.ExecuteNonQuery();
param->Value = 891;
cmd.ExecuteNonQuery();
}

//向数据库添加实数的示例
void NumericScaleX(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
_RecordsetPtr& rs = r->GetRecordsetPtr();
rs->MoveFirst();

_variant_t vi = (short)0;
FieldPtr fd = rs->Fields->GetItem(vi);
unsigned char numeri = fd->GetNumericScale();
unsigned char precision = fd->GetPrecision();

printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );
printf("GetPrecision:%d\r\n", fd->GetPrecision() );
printf("Value:%f\r\n", (float)fd->Value );
r->Close();
}

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);

ADORead(cmd);

con.Close();

::CoUninitialize();
//printf("总数:%d",count);
system("pause");
return 0;
}

songsu 2012-04-28
  • 打赏
  • 举报
回复
可以看一下开源的XproerIM。里面的系统构架还不错。
ysysbaobei 2012-04-09
  • 打赏
  • 举报
回复
大家能否再给点意见???

想把以前的软件改版,希望能规划一个合理清晰的结构,
没什么大型软件的经验、对架构也不熟悉,请大家帮帮忙!!!
ysysbaobei 2012-04-09
  • 打赏
  • 举报
回复
大家能否再给点意见???

想把以前的软件改版,希望能规划一个合理清晰的结构,
没什么大型软件的经验、对架构也不熟悉,请大家帮帮忙!!!
Cyuanyan 2012-04-05
  • 打赏
  • 举报
回复
为每一个表建立一个类可以么。。。。
lirongjun1985 2012-04-01
  • 打赏
  • 举报
回复
theApp下定义了上百个成员变量,不要什么都往theApp定义。。。可以说你的设计思路非常不清晰,完全被MFC框架所限制,MFC只是实现编码的工具类库,软件的架构设计应该在他之上。MFC把程序分成单文档,多文档,对话框程序这种思想,是非常糟糕,很容易误导初学者。其实程序员只需要建立对话框程序然后实现自己想要的功能就行了,千万别认为MFC的文档类只有单文档或者多文档程序才能用,在对话框程序里一样可以使用。说白了单文档或者多文档程序就是,复杂一些的对话框程序而已,实际上是vs向导 帮你完成了很多的代码。

数据库访问模块的设计大概应该是这样的:
对于每一个表 设计一个结构体,结构体的名字最好是表名,结构体的成员最好是字段名,程序的类型和长度与数据库保持一致,这样设计的好处是维护非常方便。还有数据库的更新,插入,删除,你可以做一个数据库操作类比如:CDbCtrl类,定义每个表的增删改操作成员函数,注意千万不要把表的结构体再定义成这个CDbCtrl类的成员变量(数据和控制要分离),因为你的UI 同样要用到这些数据,也就是说数据是公用的。有可能你把一个表的数据从数据库里读到结构体里之后,很多地方都会用到这个数据,这时候你只需要利用内存里的数据就可以了,不要每次用的时候都从数据库里取,那样效率会很低。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧