怎样设计这个布局(vc)?

coolview 2000-04-03 12:46:00
我的设计思想如下:
我的采集程序为StartAD( int nCh/*通道号*/,
int nLength /*采样长度*/,
double dSampFrequent /*采样频率*/ ,
double *dTempDataCh0/*存放通道0数据缓冲区*/,
double *dTempDataCh1/*存放通道1数据缓冲区*/,
int nSampTimes /*采样次数*/
);
一、对数据处理的算法有三种:
1.幅度相关: CollAmp( double *dTempDataColl/*处理完的数据*/,
double *dTempDataCh0/*原始通道0数据缓冲区*/,
double *dTempDataCh1/*原始通道1数据缓冲区*/,
);
2.极性相关: CollSolar(double *dTempDataColl/*处理完的数据*/,
double *dTempDataCh0/*原始通道0数据缓冲区*/,
double *dTempDataCh1/*原始通道1数据缓冲区*/,
);
3.标准化相关:CollStandard(double *dTempDataColl/*处理完的数据*/,
double *dTempDataCh0/*原始通道0数据缓冲区*/,
double *dTempDataCh1/*原始通道1数据缓冲区*/,
);
二、由于上述算法处理完的数据能画出一个波形,有一个峰值,而求峰值
对应的“横轴坐标”有两种方法:
1.幅值平均法:
先采集一次,求出其相关值,画出一条波形,再采集一次,求出相关
值后,又可画一条波形,两条波形对应叠加求平均后得出一条新的
波形,然后再采集nSampTimes次,最后得出一条曲线,求出峰值所对
应的横坐标值.
2.延时平均法:
先采集一次,求出其相关值,画出一条波形,求出峰值所对应的横
坐标值t1,再采集一次,求出t2,......,求出tn.最后求出这n个
坐标值的平均值.
我的要求是:
(1)采集点数,采样频率,可以随时改变,可以控制采集的启动与停止;
(2)算法先选定,求横坐标值方法也可以先选定.处理时要求三种算法一次必
须选一种,同时求横坐标值方法也必须选一种,
(3)根据(2)选定后,就可以启动采集,假设采集99次,在我的窗口就可以看到
曲线的动态变化了.因为我的窗口内主要是显示相关波形的叠加变化,因为每次
叠加,都会使峰值变化,叠加到一定程序后趋于"稳定",这时就可以找到横坐标
值了.
请问我应该怎样布局我的程序?在OnDraw(),或OnTimer()等等响应过程里应
该如何布局程序结构?
...全文
208 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
telan 2000-04-17
  • 打赏
  • 举报
回复
coolview无话可说?无言以对?
coolview 2000-04-16
  • 打赏
  • 举报
回复
telan 2000-04-07
  • 打赏
  • 举报
回复
采用线程来采集数据可以保持主界面线程是
激活的,不被阻塞,可以随时终止采集过程。
计算量若不大,可以放在主线程中,如下面
代码,若计算量大,也可以采用计算线程,
可以用类似下面的方法保持同步。

线程之间可以用最简单的全局变量来共享数据。


// 公共变量
HANDLE gEvent[2];
// gEvent[0] 开始采集数据
// gEvent[1] 终止采集线程


DWORD WINAPI GetDataThread(LPVOID pParam)
{
HWND hWnd = (HWND) pParam;
.......

BOOL bContinue = TRUE;
DWORD dwEvent;

while(bContinue)
{
dwEvent = WaitForMultiObjects(2,gEvent,FALSE,INFINITE);
switch(dwEvent)
{
case WWAIT_OBJECT_0 :
// 接收数据
......

// 接收完成
ResetEvent(gEvent[0]);
::SendMessage(hWnd,DATA_READY,...,...);
break;
case WAIT_OBJECT_0 +1:
ResetEvent(gEvent[1]);
bContinue = FALSE;
break;
} // SWITCH
} // WHILE LOOP END

return 1;
}



void CXXXView::OnStart()
{
gEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
gEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
if (gEvent[0] == NULL and and gEvent[1] == NULL )
{
AfxMessageBox("CreateEvent Fail!");
return;
}

DWORD dwThreadId;
HANDLE hThread;

hThread = CreateThread(NULL,0,GetDataThread,(LPVOID)GetSafeHwnd(),0,&dwThreadId);

if( hThread == NULL)
{
AfxMessageBox("Create GetData Thread Error!");
return ;
}

CloseHandle(hThread);

// 以上为启动采集线程的部分,可以在其他地方完成

// 采集数据只需:

SetEvent(gEvent[0]);


// 结束采集线程只需: SetEvent(gEvent[1]);
}


void CXXXView::OnDataReady() // 自定义消息
{
// 开始计算
.....

// 计算完成,画图
Invalidate(); // 调用OnDraw()或者直接在此写画图代码

// 重新采集数据
SetEvent(gEvent[0]);

......
}
coolview 2000-04-06
  • 打赏
  • 举报
回复
各位大侠们,这个问题真的有这么难吗?我的子函数都已经编写完,只是
整体布局不太利索,看看各位有什么好的方法.谁知竟然问题没有几人回
答?真是奇怪.不知大侠是不是嫌分低?
coolview 2000-04-04
  • 打赏
  • 举报
回复
能否在具体一点?谢谢.
laole 2000-04-04
  • 打赏
  • 举报
回复
多用几个变量在ondraw中作为流程的控制不可以吗?
coolview 2000-04-04
  • 打赏
  • 举报
回复
各位大侠,这个问题这么复杂吗?
telan 2000-04-03
  • 打赏
  • 举报
回复
肯定要用多线程的方式啦,专门有一个线程来
负责数据,采集一定的数据之后就可以计算,
根据你的计算量的大小,如果有必要,也可以
再用一个线程来负责计算。主线程就负责
控制线程的启动和终止,以及画图。
只不过线程的同步是一个稍稍麻烦一点的事情。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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