摘要:我是做行业软件的所以经常会接触到对数据进行实时采集的问题。一般的问题是,一个线程读取数据,其他的线程对数据进行处理(如画出实时曲线,将数据存入文件等等)。这涉及到两方面问题.1,线程的同步问题—典型的生产者和消费者的问题;2,数据结构问题。即将采集的数据以什么形式存储并由消费者进行读取。
下面我将对这两个问题和大家一起探讨一下。相信大家对生产者消费者问题并不陌生。在读书的时候我们采用......
摘要: mmx和sse都是intel开发的基于simd(单指令多数据流)的技术。所谓单指令多数据流是指可以用一条指令可以完成多个数据的操作。虽然64位系统已经推出,但是我们大部分都是使用32位系统,所以如果要完成两个128位的相加运算,用普通32位指令很明显要执行4条相加指令,而基于64位的mmx指令只需要执行两次即可完成,更强大的sse能一次处理128位,故一次就可以完成操作,所以采用mmx及sse优......
VC 点滴 之 重绘?
1.onpaint与ondraw函数 【程序编程相关:
Linux 服务器集群系统 】
一.??????????? 基本知识: 【推荐阅读:
(原创)关于如何处理EXCEL( CSV】
2.cpaintdc与cclietndc 【扩展信息:
通用 文件保存至数据库,从数据库写入磁盘】
view的父类的onpaint函数调用了ondraw函数,若在子类为wm_paint消息添加响应函数onpaint,ondraw函数将不会被调用.
cpaintdc的构造函数中调用了beginpaint(),析构函数中调用了endpaint();
cclietndc的构造函数中调用了getdc(),析构函数中调用了releasedc().
而beginpaint(),endpaint()只能用于响应wm-paint消息,否则将会出错.
二.??????????? 利用动态数组:
1.定义结构体line,用于保存线的数据.
struct line
{
?????? cpoint m_pt1;
?????? cpoint m_pt2;
};
2.在view中定义一个动态数组,保存每一根线的指针.
cptrarray m_ptrlines;
定义两个cpoint的成员变量,保存线的起点与终点:
?? cpoint m_ptold;
?????? cpoint m_ptnew;
3.在view中加入wm_lbuttondown,wm_lbuttonup的响应函数,在onlbuttondown中为m_ptnew赋值,
??? m_ptold=point;
4.在onlbuttonup中加入代码:
m_ptnew=point;
?????? cclientdc dc(this);
?????? ?????? ?????? dc.moveto(m_ptold);
?????? dc.lineto(point);
?????? ????????????? line *pln=new line;
?????? pln->m_pt1=m_ptold;
?????? pln->m_pt2=m_ptnew;
?????? m_ptrlines.add(pln);
5.在ondraw()中加入:
int sum= m_ptrlines.getsize();
for(int i=0;i
{
?????? pdc->moveto(((line *)m_ptrlines.getat(i))->m_pt1);
?????? pdc->lineto(((line *)m_ptrlines.getat(i))->m_pt2);
}
6.加入滚动条:将view的cpp文件与h文件中的cview全部替换成cscrollview.
7.在view中加入虚函数oninitialupdate(),这个函数在view第一次刷新前被调用,在其中加入代码:
setscrollsizes(mm_text,csize(1024,768));
????????????? 这个函数也可在view的构造函数中调用.
8.在onlbuttonup中生成dc后加入
onpreparedc(&dc);
?????? ?????? dc.dptolp(&m_ptold);
?????? dc.dptolp(&m_ptnew);
三.??????????? 利用cmetafiledc重绘
1.在view中定义成员变量:
?????? cmetafiledc m_dcmetafile;
2.在view的oncreate中加入代码:
m_dcmetafile.create();
3.在view的onlbuttonup中,注释有关数组的代码,加入:
m_dcmetafile.moveto(m_ptold);
m_dcmetafile.lineto(m_ptnew);
4.在ondraw()中
?????? hmetafile hmetafile;
?????? hmetafile=m_dcmetafile.close();
?????? pdc->playmetafile(hmetafile);
?????? m_dcmetafile.create();
?????? m_dcmetafile.playmetafile(hmetafile);
?????? ::deletemetafile(hmetafile);
5.保存文件:
加入菜单响应函数,onfilesave,加入代码:
?????? hmetafile hmetafile;
?????? hmetafile=m_dcmetafile.close();
?????? ::copymetafile(hmetafile,"c:\\2.ddd");
?????? m_dcmetafile.create();
?????? m_dcmetafile.playmetafile(hmetafile);
?????? ::deletemetafile(hmetafile);
6.读出文件:
加入菜单响应函数,onfileload,加入代码:
?????? ?????? hmetafile hmetafile;...
下一页 摘要:第五章 隐藏实现细目 首先考虑oop的一个重要思想--让变动的东西和不变动的事物彼此分开。 java库的程序员在编写库的时候最需要考虑到的就是,一旦他们改变类中的某个函数或者是成员变量,让已经使用前一版本库的程序不会受到变动的影响。库的编写者无法知道程序员调用用了库中那些函数和变量,因而无法修改库的成员,于是为了解决这样的问题,java中出现了访问控制符,其作用就是告诉程序员,那些是可用的,那些是......