陈 英
[摘要]对一个生物电波应用程序中的数据采集方法进行了研究,阐述多线程的原理及实际应用方法,运用VC++实现了数据采集。生物电波应用程序是针对医院的一些生物电波采集仪器,结合现代医学生理学原理与临床应用的实际需要设计的。医生在生物电波采集设备的帮助下,通过计算机上简单的操作界面,对患者的身体某部位的生物电波进行采样,然后对所得到的数据进行分析和测量。
[关键词]数据采集 VC++ 生物电波
中图分类号:Q64文献标识码:A文章编号:1671-7597(2009)0220056-02
一、多线程基础
在Win32 API的基础之上,MFC提供了处理线程的类和函数。MFC对多线程进行一种简单的封装,其中每个线程都是从CWinThread类继承而来的。每一个应用程序的执行都有一个主线程,主线程也是从CWinThread类继承而来的。可以利用CWinThread对象创建应用程序执行的其他线程。处理线程的类是CWinThread,它的成员变量m_hThread和m_hThreadID是对应的Win32线程句柄和线程ID。MFC多线程编程中经常用到的几个全局函数函数是AfxBeginThread、AfxEndThread等。
MFC明确区分两种线程:用户界面线程(User interface thread)和工作者线程(Worker thread)。用户界面线程一般用于处理用户输入并对用户产生的事件和消息作出应答。工作者线程用于完成不要求用户输入的任务,如耗时计算。
线程函数的格式如下:
UNIT函数名(LPVOID pParam)
工作者线程的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority,
UINT nStackSize,
DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs
)
其中参数1指定控制函数的地址;参数2指定传递给控制函数的参数;参数3、4、5分别指定线程的优先级、堆栈大小、创建标识、安全属性,含义同用户界面线程。
二、实现线程函数
在CDlgget.cpp文件中加入创建线程函数的代码:
//以下为用于同时产生采样曲线的线程函数
UINT Pen1(LPVOID param)
{
p->Online(1); //调用画线函数在特定位置画线,参数将决定画像的起始位置
return 0; //返回值为无符号整数
}
…
UINT Pen10(LPVOID param)
{
p->Online(10);
return 0;
}
修改Online(int i)函数代码如下:
void CDlgget::Online( int i )
{
int k=m*i;
int x=0,y=0;
CClientDC dc(this);
CPen MyNewPen,MyNewPen1;
CPen* pOriginalPen=dc.GetCurrentPen();
MyNewPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
MyNewPen1.CreatePen(PS_SOLID,1,RGB(220,220,220));
dc.SelectObject(&MyNewPen);
dc.MoveTo(24,k);
unsignedint q=i*1000;
::srand(q);
for(x=24;x<1024;x=x+2)
{
if(!stop) //判断是否需要停止画线
{
if(n>5000) //画到屏幕最右端时共产生5000个点
{
//在显示新画的线时需要搽除以前的线
dc.SelectObject(&MyNewPen1)
//覆盖以前的线即可
dc.Rectangle(x,m,x+2,11*m);
dc.SelectObject(&MyNewPen);
}
::Sleep(10);
y=k+rand()%20;
dc.LineTo(x,y);
n++;
if(x==1022)
{
//如果到了屏幕最右端则从左边重新开始
x=24;
dc.MoveTo(24,k);
}
}
}
dc.SelectObject(pOriginalPen);
MyNewPen.DeleteObject();
MyNewPen1.DeleteObject();
}
三、启动线程执行
修改OnBegin()函数代码如下:
void CDlgget::OnBegin()
{
// TODO: Add your control notification handler code here
//启动画线的十个工作线程
AfxBeginThread(Pen1,THREAD_PRIORITY_NORMAL);
AfxBeginThread(Pen2,THREAD_PRIORITY_NORMAL);
…
AfxBeginThread(Pen10,THREAD_PRIORITY_NORMAL);
}
修改OnStop()函数代码如下:
void CDlgget::OnStop()
{
// TODO: Add your control notification handler code here
stop=true;
}
运行程序,结果如图1所示。
四、结束语
一般的生物电波采集仪是在消化吸收现有脑电图原理和分析方法后,应用现代电子技术和计算机技术,结合现代医学生理学原理与临床应用的实际需要设计的。本文中采用VC++进行开发,在采集数据时运用多线程编程技术,可以适时采集并存储生物电波数据,显示生物电波波形。然后,可对所采集的数据进行高、低频虑波和时间常数设置并进一步进行频谱分析,显示频谱图。
参考文献:
[1]梁建武、陈英,Visual C++程序设计实验指导与实训[M].中国水利水电出版社,2006.7.
[2]候俊杰,深入浅出MFC(第二版)[M].华中科技大学出版社,2001.1.
作者简介:
陈英,女,汉族,湖南省新田县人,副教授,硕士学位,现任长沙民政职业技术学院教师,主要研究方向为软件工程,计算机网络应用。