如何实现一个定时任务来对数据库中的数据进行 *** 作

如何实现一个定时任务来对数据库中的数据进行 *** 作,第1张

由于公司的新接得项目要实现一批数据的同步,通过外围厂商提供的一系列各个系统的webervices接口定时将数据同步到我们开发的共享平台上,由于厂商系统的数据是不断在变化以及各系统闲忙时的特点,所以定时同步任务的执行必须在时间上能够动态配置。因此,我们需要动态的从数据库中获取配置信息,以改变各个定时间的执行规则,废话不说了,上代码:(我利用的是ssh框架直接写的,框架搭建不再叙述)

1.创建数据表(我用的是MySQL)

[sql] view plain copy

DROP TABLE IF EXISTS `t_wsdoc`

CREATE TABLE `t_wsdoc` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`triggername` varchar(50) NOT NULL,

`jobdetailname` varchar(50) N

不如考虑联合编程,用别的软件读取,再经matlab处理

Matlab是否支持调用usb接口,就像调用串口一样

方法一:使用

VC++

提供的串行通信控件

MSComm

首先,在对话框中创建通

信控件,若

Control

工具栏中缺少该控件,可通过菜单

Project

>Add to

Project

>Components and Control

插入即可,再将该控件从工具箱中拉

到对话框中。此时,你只需要关心控件提供的对

Windows

通讯驱动程序的

API

函数的接口。

换句话说,

只需要设置和监视

MSComm

控件的属性和事件

ClassWizard

中为新创建的通信控件定义成员对象(

CMSComm

m_Serial

),通过该对象便可以对串口属性进行设置,

MSComm

控件共有

27

个属性,这里只介绍其中几个常用属性:

CommPort

设置并返回通讯端口号,缺省为

COM1

Settings

以字符串的形式设置并返回波特率、

奇偶校验、

数据位、

停止位。

PortOpen

设置并返回通讯端口的状态,也可以打开和关闭端口。

Input

从接收缓冲区返回和删除字符。

Output

向发送缓冲区写一个字符串。

InputLen

设置每次

Input

读入的字符个数,

缺省值为

0

表明读取接收缓

区中的全部内容。

InBufferCount

返回接收缓冲区中已接收到的字符数,将其置

0

可以清除

接收缓

冲区。

InputMode

定义

Input

属性获取数据的方式(为

0

:文本方式;为

1

:二

进制方式)。

RThreshold

SThreshold

属性,表示在

OnComm

事件发生之前,

接收缓冲区或发送缓冲区中可以接收的字符数。

以下是通过设置控件属性对串口进行初始化的实例:

BOOL CSampleDlg:: PortOpen()

{

BOOL m_Opened

……

m_Serial.SetCommPort(2)//

指定串口号

m_Serial.SetSettings(“4800,N,8,1″)//

通信参数设置

m_Serial.SetInBufferSize(1024)//

指定接收缓冲区大小

m_Serial.SetInBufferCount(0)//

清空接收缓冲区

m_Serial.InputMode(1)//

设置数据获取方式

m_Serial.SetInputLen(0)//

设置读取方式

m_Opened=m_Serail.SetPortOpen(1)//

打开指定的串口

return m_Opened

}

打开所需串口后,

需要考虑串口通信的时机。

在接收或发送数据过程中,

能需要监视并响应一些事件和错误,

所以事件驱动是处理串行端口交互作用的一

种非常有效的方法。

使用

OnComm

事件和

CommEvent

属性捕捉并检查通

讯事件和错误的值。发生通讯事件或错误时,将触发

OnComm

事件,

CommEvent

属性的值将被改变,应用程序检查

CommEvent

属性值并作出

相应的反应。在程序中用

ClassWizard

CMSComm

控件添加

OnComm

息处理函数:

void CSampleDlg::OnComm()

{

……

设数据发送时间间隔

TimeCycle

相同的定时器:

SetTimer(1,TimeCycle,NULL)

,进行定时读取或发送。

CSampleView:: OnTimer(UINT nIDEvent)

{

char InputData[30]

m_Serial.ReadData(InputData,30)

//

数据处理

}

若对端口数据的响应时间要求较严格,

可采用事件驱动

I/O

读写,

Windows

定义了

9

种串口通信事件,较常用的有:

EV_RXCHAR:

接收到一个字节,并放入输入缓冲区。

EV_TXEMPTY:

输出缓冲区中的最后一个字符发送出去。

EV_RXFLAG:

接收到事件字符

(DCB

结构中

EvtChar

成员

)

,放入输入缓

冲区。

在用

SetCommMask()

指定了有用的事件后,应用程序可调用

WaitCommEvent()

来等待事件的发生。

SetCommMask(hComm,0)

可使

WaitCommEvent()

中止。

方法三

线程下实现串行通信

方法一,

二适用于单线程通信。

在很多工业控制系统中,

常通过扩展串口连

接多个外设,

各外设发送数据的重复频率不同,

要求后台实时无差错捕捉,

采集,

处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,

以便在指定的事件发生时向相关的窗口发送通知消息。

线程的基本概念可详见

VC++

参考书目,

Windows

内部的抢先调度程序在

活动的线程之间分配

CPU

时间,

Win 32

区分两种不同类型的线程,一种是用

户界面线程

UI

User Interface Thread

,

它包含消息循环或消息泵,用于处

理接收到的消息;另一种是工作线程(

Work Thread

),它没有消息循环,用

于执行后台任务。用于监视串口事件的线程即为工作线程。

多线程通信类的编写在端口的配置,

连接部分与单线程通信类相同,

在端口

配置完毕后,

最重要的是根据实际情况,

建立多线程之间的同步对象,

如信号灯,

临界区,事件等,相关细节可参考

VC++

中的同步类。

一切就绪后即可启动工作线程:

CWinThrea *CommThread = AfxBegin

Thread(CommWatchThread, //

线程函数名

(LPVOID) m_pTTYInfo, //

传递的参数

THREAD_PRIORITY_ABOVE_NORMAL, //

设置线程优先级

(UINT) 0, //

最大堆栈大小

(DWORD) Create_SUSPENDED , //

创建标志

(LPSECURITY_ATTRIBUTES) NULL)//

安全性标志

同时,在串口事件监视线程中:

if(WaitCommEvent(pTTYInfo->idComDev,&dwEvtMask,NULL))

{

if((dwEvtMask &pTTYInfo->dwEvtMask )== pTTYInfo->dwEvtMask)

{

WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF)

ResetEvent(pTTYInfo->hPostEvent)//

置同步事件对象为非信号态

::PostMessage(CSampleView,ID_COM1_DATA,0,0)//

发送通知消息

}

}

PostMessage()

向指定窗口的消息队列发送通知消息,相应地,需要在

该窗口建立消息与成员函数间的映射,用

ON_MESSAGE

将消息与成员函数名

关联。

BEGIN_MESSAGE_MAP(CSampleView, CView)

//{{AFX_MSG_MAP(CSampleView)

ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data)

ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)

…..

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

然后在各成员函数中完成对各串口数据的接收处理,

但必须保证在下一次监

测到有数据到来之前,

能够完成所有的中间处理工作。

否则将造成数据的捕捉错

误。

多线程的实现可以使得各端口独立,

准确地实现串行通信,

使串口通信具有

更广泛的灵活性与严格性,且充分利用了

CPU

时间。但在具体的实时监控系统

中如何协调多个线程,

线程之间以何种方式实现同步也是在多线程串行通信程序

实现的难点。

一个读串口的函数:

HANDLE m_hIDComDev

int ReceiveComm(char* RecCommData)

{

DWORD dRead,dReadNum

COMSTAT ComStat

LPDWORD ComError

char *Data

ClearCommBreak(m_hIDComDev)

ClearCommError(m_hIDComDev,ComError,&ComStat)

dRead=ReadFile(m_hIDComDev, Data, ComStat.cbInQue,

&dReadNum, NULL)//

接收

200

个字符

//dReadNum

为实际接收字节数

PurgeComm(m_hIDComDev,PURGE_RXCLEAR)//

清空接收缓冲区

for(int i = 0 i <ComStat.cbInQuei++)

{

*RecCommData = *Data

RecCommData++

Data++

}

*RecCommData = ‘

\

0′

if(dRead)

return 1

else

return 0

}

VC

不是语言

,VC

是编程环境

,C,C++

是编程语言

,VC

中编写

C,C++

是比较方便的

,

较好的环境

.

vc

编程源程序要求用

C++

语言来编写

,

在这裏写一下

C++

语言就可以了吧

!

C++

支持面向对象的程序设计方法

,

并可以使用

MS

MFC,

所开发的软件稳定性好

,

可移植性

,

软件与硬件相互独立

.C++

也是一种混合型的程序设计语言

,

既可以支持传统的面向过程的

程序设计

,

也支持现在的面向对象的程序设计

(

面向对象的方法实现了软件的重用问题

,

加速

了软件的开发过程

),C++

既适合作为系统软件的描述语言也适合应用软件的开发语言

,

C

言比它的错误检查机制更强

,

还提供了相关的检查类

,

以编写模块化程度高

,

可重用性和可维

护性佳更适合於大

,

中型程序的开发

.

百新安阳 董行

检查一下程序是否存在内存泄漏,监控程序的运行状况,比如内存和CPU的占用等。

如果检查泄漏,对你来说比较复杂和麻烦。这种定时任务的情况,可以不需要程序一直运行,执行一次 *** 作完毕,记录好日志后,程序可以退出。之后的启动可以通过计划任务来触发。这样也可以在一定程度上避免。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9234396.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存