陳 英
[摘要]對一個生物電波應用程序中的數據采集方法進行了研究,闡述多線程的原理及實際應用方法,運用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.
作者簡介:
陳英,女,漢族,湖南省新田縣人,副教授,碩士學位,現任長沙民政職業技術學院教師,主要研究方向為軟件工程,計算機網絡應用。