4486|9

161

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

网络开发笔记12_数据采集与存储 [复制链接]

终于要完成这个工程了

       讲了那么多东西,终于要完成这个工程了,有点兴奋。其实在这里我可以不讲什么的了。因为在这个工程里基本的东西我都讲得差不多了。虽然不了解线程,但肯定写过C程序,这个工程也就可分为两个程序完成,一个死循环的程序进行数据采集和存储,另一个MFC程序查询就行了。

       不过在这里我得用一个程序来完成。那就得用线程了,因为在我们的MFC界面里没法去加死循环。

 

什么是线程

       线程(thread),有时被称为轻量级进程(Lightweight ProcessLWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程

 

MFC里的线程

       MFC里有两种方式可以创建线程和使用线程,一种是C语言方式,另一种是C++方式。我现在用C++方试来创建线程。

 

多线程的实现

       用我们的connectDB工程,建一个sjcjDB工程,并打开,新建一个线程类CWinThread,如图1

1.jpg (20.28 KB, 下载次数: 0)

1.jpg

网络开发笔记12_数据采集与存储.pdf

187.9 KB, 下载次数: 183

最新回复

呵呵,这种实现方法虽然方便,但是很多人看不懂 很多人也不用mfc的,而且mfc实现得很复杂,虽然看上去简单  详情 回复 发表于 2010-11-12 23:04
 
点赞 关注

回复
举报

161

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

1. DbThread.h处理

DbThread.h里加入一些必要的头文件,和一些必要的全局变量等,具体如下,

#include "AdcInf.h"

#include <WINSOCK2.H>

protected:

       CDbThread();

       virtual ~CDbThread();

改为

public:

       CDbThread();           // protected constructor used by dynamic creation

       virtual ~CDbThread();

定议一个构造函数CDbThread(CAdcInf *rs)

公共变量

      CAdcInf *rs;

       int sockSrv;

       int  sockClient;

       SOCKADDR_IN addrSrv;

       SOCKADDR_IN addrClient;

       char buf[20];

 

2. DbThread.c的处理

       DbThread.c中,完成构造函数,完善线程初始化与退出,及线程运行。代码如下

CDbThread::CDbThread(CAdcInf *rs)

{

       this->rs=rs;

}

 

BOOL CDbThread::InitInstance()

{

       // TODO:  perform and per-thread initialization here

       //初始化TCP服务器

       WORD wVersionRequested;

       WSADATA wsaData;

       int err;

       wVersionRequested = MAKEWORD( 1, 1 );

       err = WSAStartup( wVersionRequested, &wsaData );

       if ( err != 0 ) {

              return 1;

       }

       if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )

              {

                     WSACleanup();

                     return TRUE;

              }

       sockSrv=socket(AF_INET,SOCK_STREAM,0);

       addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

       addrSrv.sin_family=AF_INET;

       addrSrv.sin_port=htons(1001); 

       bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));     

       listen(sockSrv,2);

       return TRUE;

}

int CDbThread::ExitInstance()

{

       // TODO:  perform any per-thread cleanup here

       //清除TCP

              closesocket(sockSrv);

              WSACleanup();

       return CWinThread::ExitInstance();

}

 

 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

int CDbThread::Run()

{

       //完成数据的接收与存储

       int len;

       len=sizeof(SOCKADDR);

       while(1)

       {

              sockClient=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

              recv(sockClient,buf,20,0);//数据接收

              closesocket(sockClient);

              rs->Open(AFX_DB_USE_DEFAULT_TYPE,  _T("Select adcId,adcVal from adcTbl"));

              if(rs->IsOpen())

        {

            rs->MoveLast();

                     UINT i=rs->m_adcId;

                     i++;       

                     rs->MoveLast();//重要

                     rs->Edit();     //存储

                     rs->AddNew();

                     rs->m_adcId=i;

                     rs->m_adcVal=buf;

                     rs->Update();

                    

        }

              rs->Close();

              Sleep(1000);

       }

}

 

线程的使用

BOOL CConnectDBDlg::OnInitDialog()

{

       //前面保留

       ……………………………….

       //后面添加如下代码

       // TODO: Add extra initialization here

 

       CDatabase db;

       if(db.Open(_T("sjcjDB"),false,false,_T("ODBC;"),false))

       {

              this->rs=new CAdcInf(&db);

              CDbThread *mythread=new CDbThread(rs);//创建一个线程

              mythread->CreateThread(0,0,NULL);//使线程运行起来

       }

 

       return TRUE;  // return TRUE  unless you set the focus to a control

}

 

 

 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

4
 

查询的相关更改

void CConnectDBDlg::OnButton1()

{

              CString strSql;

              rs->Open(AFX_DB_USE_DEFAULT_TYPE,  _T("Select adcVal from adcTbl"));

              if(rs->IsOpen())

        {

            rs->MoveFirst();

                     CString strVal;

            while(!rs->IsEOF())

            {

                //读取记录

                rs->GetFieldValue(_T("adcVal"), strVal);

                            ((CListBox*)GetDlgItem(IDC_LIST2))->AddString(strVal);                           

                rs->MoveNext();                                                     

            }

        }

              rs->Close();

 

}

 

工程的设置

       因为使用了WinSock, 所以要在工程里加入所须的库,工程à设置à连接à对象/库模块

加入ws2_32.lib,如图2所示

八 运程效果
程序运行效果如图3

 
图3
程序运行后数据库如图4

2.jpg (61.96 KB, 下载次数: 0)

2.jpg

3.jpg (22.15 KB, 下载次数: 0)

3.jpg

4.jpg (29.56 KB, 下载次数: 0)

4.jpg
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

5
 
楼主在这里讲VC了,建议可以单独开一个系列贴
 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 5楼 fengzhang2002 的帖子

这里是在讲MFC但是不是和LM3S网络开发没有任何联系。我从第八篇开始在讲LM3s的数据采集与存储,我也不想那么麻烦,整那么三四篇讲MFC,不过我想问下在这里看的,能有几个看得懂MFC程序呢,我仅不想别人看得云里雾里。从第八篇到这里是一个数据采集与存储工程的结束。所以我个人认为把这几篇MFC列入网络学习不会有错的。
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

7
 

回复 6楼 yuhua8688 的帖子

我估计能看懂MFC程序的不多,毕竟很多都是学硬件的,现在用MFC的越来越少了,很多硬件结合软件测试也只用用VB就行了
 
 
 

回复

1万

帖子

16

TA的资源

版主

8
 

楼主把软硬件结合起来,这样的人才是三中全会型地

I服了YOU
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

1012

帖子

0

TA的资源

五彩晶圆(初级)

9
 
呵呵,这种实现方法虽然方便,但是很多人看不懂

很多人也不用mfc的,而且mfc实现得很复杂,虽然看上去简单
 
 
 

回复

161

帖子

0

TA的资源

一粒金砂(高级)

10
 

回复 9楼 ssawee 的帖子

呵呵,下次听你们的,遇到上位机程序,就改用VB、C#、JAVA、QT4这些语言。下位机程序,我想到不会担心没人看得懂了吧|
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表