分布式并行编程
❶ 大数据工程师学哪些核心技术是什么
【导读】提起大数据大家都不陌生,是高薪的代名词。因此吸引了不少零基础和跨行业的的小伙伴想要进入到此行业,那么大数据工程师学哪些?核心技术是什么呢?为了帮助大家更好的融入到工作中,小编整理了以下几点,希望对大家有所帮助。
一、大数据采集
大数据采集,即对各种来源的结构化和非结构化海量数据,所进行的采集。
数据库采集:流行的有Sqoop和ETL,传统的关系型数据库MySQL和Oracle
也依然充当着许多企业的数据存储方式。当然了,目前对于开源的Kettle和Talend本身,也集成了大数据集成内容,可实现hdfs,hbase和主流Nosq数据库之间的数据同步和集成。
网络数据采集:一种借助网络爬虫或网站公开API,从网页获取非结构化或半结构化数据,并将其统一结构化为本地数据的数据采集方式。
文件采集:包括实时文件采集和处理技术flume、基于ELK的日志采集和增量采集等等。
二、大数据预处理
大数据预处理,指的是在进行数据分析之前,先对采集到的原始数据所进行的诸如“清洗、填补、平滑、合并、规格化、一致性检验”等一系列操作,旨在提高数据质量,为后期分析工作奠定基础。数据预处理主要包括四个部分:数据清理、数据集成、数据转换、数据规约。
三、大数据储存
大数据每年都在激增庞大的信息量,加上已有的历史数据信息,对整个业界的数据存储、处理带来了很大的机遇与挑战.为了满足快速增长的存储需求,云存储需要具备高扩展性、高可靠性、高可用性、低成本、自动容错和去中心化等特点.常见的云存储形式可以分为分布式文件系统和分布式数据库。其中,分布式文件系统采用大规模的分布式存储节点来满足存储大量文件的需求,而分布式的NoSQL数据库则为大规模非结构化数据的处理和分析提供支持。
四、大数据清洗
MapRece作为Hadoop的查询引擎,用于大规模数据集的并行计算,”Map(映射)”和”Rece(归约)”,是它的主要思想。它极大的方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统中。随着业务数据量的增多,需要进行训练和清洗的数据会变得越来越复杂,这个时候就需要任务调度系统,比如oozie或者azkaban,对关键任务进行调度和监控。
五、大数据查询分析
Hive的核心工作就是把SQL语句翻译成MR程序,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive
SQL)查询功能。Hive本身不存储和计算数据,它完全依赖于HDFS和MapRece。可以将Hive理解为一个客户端工具,将SQL操作转换为相应的MapRece
jobs,然后在hadoop上面运行。Hive支持标准的SQL语法,免去了用户编写MapRece程序的过程,它的出现可以让那些精通SQL技能、但是不熟悉MapRece
、编程能力较弱与不擅长java语言的用户能够在HDFS大规模数据集上很方便地利用SQL 语言查询、汇总、分析数据。
六、大数据可视化
大规模数据的可视化主要是基于并行算法设计的技术,合理利用有限的计算资源,高效地处理和分析特定数据集的特性。通常情况下,大规模数据可视化的技术会结合多分辨率表示等方法,以获得足够的互动性能。
在科学大规模数据的并行可视化工作中,主要涉及数据流线化、任务并行化、管道并行化和数据并行化4 种基本技术。
以上就是小编今天给大家整理发送的关于“大数据工程师学哪些?核心技术是什么?”的相关内容,希望对大家有所帮助。想了解更多关于数据分析及人工智能就业岗位分析,关注小编持续更新。
❷ MapRece 与 HBase 的关系
MapRece与HBase没有关系:
MapRece:
MapRece是一种编程模型,用于大规模数据集的并行运算。概念"Map"和"Rece",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
HBase:
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。
就像Bigtable利用了Google文件系统所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。
(2)分布式并行编程扩展阅读:
MapRece集群中使用大量的低端服务器,因此,节点硬件失效和软件出错是常态,因而一个良好设计、具有高容错性的并行计算系统不能因为节点 失效而影响计算服务的质量。
任何节点失效都不应当导致结果的不一致或不确定性;任何一个节点失效时,其他节点要能够无缝接管失效节点的计算任务;当失效节 点恢复后应能自动无缝加入集群,而不需要管理员人工进行系统配置。
MapRece并行计算软件框架使用了多种有效的错误检测和恢复机制,如节点自动重 启技术,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。
❸ 从并行计算的角度对比,MPI 与 OpenMP 有什么区别
OpenMP和MPI是并行编程的两个手段,对比如下:
OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差。
MPI:进程级;分布式存储;显式;可扩展性好。OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂。
需要分析及划分应用程序问题,并将问题映射到分布式进程集合。需要解决通信延迟大和负载不平衡两个主要问题。
延伸论述:
我认为,要理解OpenMP和MPI,首先要有一些操作系统知识和系统编程基础——OpenMP对应的实际上是单进程多线程的并发编程模型,可以将一个单线程的程序按for循环拆分成多线程——相当于pthread_create。
对于同一个进程的多个线程来说,由于它们只是独占自己的栈内存,堆内存是共享的,因此数据交换十分地容易,直接通过共享变量就可以进行交换,编程模型非常简单易用,并且对于操作系统来说,线程的上下文切换成本也比进程低很多。
然而另一方面,由于线程不能脱离进程独立存在,而一个进程不能存在于多台机器上,所以OpenMP只适用于拥有多个CPU核心的单台电脑。并且多线程编程存在临界区(Critical Section),需要你自己去加锁,解决Race Condition问题,否则的话很容易导致不可预知的后果。
而MPI则是多进程的并发编程模型,相当于你自己调用fork——每一个进程的内存地址空间都是独立的,它们彼此之间几乎什么都不共享,只能通过进程间通信(IPC)来交换彼此的数据,因此编程难度明显要大很多。
MPI有一个非常显着的优点,那就是对于一个分布式系统来说,进程是可以在分布式系统的每一台电脑之间转移的,因此对于拥有多台电脑的分布式系统来说,其并发性要明显好于OpenMP。
❹ 采用并行计算的程序用什么编程语言开发最好
分布式(即并行计算)的编写一般用的是C++(也有用JAVA的,但是都是娱乐性质的项目了,不是主流),基本不用MPI接口。并行计算用MPI或者OpenMP。如果把网格计算算做分布式计算(网格计算是分布式计算的一种特例,但是有区别,区别仅仅在编程方法和实际应用的范围上),网格计算使用中间件!而且对联网的各台计算机的操作系统的要求比较特殊。
当然vb也是可以的,c++这方面的类库比较多。
❺ 毕业设计 我想阐述一下并行计算的发展
从20世纪40年代开始的现代计算机发展历程可以分为两个明显的发展时代:串行计算时代、并行计算时代。每一个计算时代都从体系结构发展开始,接着是系统软件(特别是编译器与操作系统)、应用软件,最后随着问题求解环境的发展而达到顶峰。
并行计算机是由一组处理单元组成的。这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。因此,并行计算机的两个最主要的组成部分是计算节点和节点间的通信与协作机制。并行计算机体系结构的发展也主要体现在计算节点性能的提高以及节点间通信技术的改进两方面。
节点性能不断进步
20世纪60年代初期,由于晶体管以及磁芯存储器的出现,处理单元变得越来越小,存储器也更加小巧和廉价。这些技术发展的结果导致了并行计算机的出现。这一时期的并行计算机多是规模不大的共享存储多处理器系统,即所谓大型主机。IBM 360是这一时期的典型代表。
到了20世纪60年代末期,同一个处理器开始设置多个功能相同的功能单元,流水线技术也出现了。与单纯提高时钟频率相比,这些并行特性在处理器内部的应用大大提高了并行计算机系统的性能。伊利诺依大学和Burroughs公司此时开始实施Illiac Ⅳ计划,研制一台64颗CPU的SIMD主机系统,它涉及到硬件技术、体系结构、I/O设备、操作系统、程序设计语言直至应用程序在内的众多研究课题。不过,当一台规模大大缩小的原型系统(仅使用了16颗CPU)终于在1975年面世时,整个计算机界已经发生了巨大变化。
首先是存储系统概念的革新,提出虚拟存储和缓存的思想。以IBM 360/85和IBM 360/91为例,两者是属于同一系列的两个机型,IBM 360/91的主频高于IBM 360/85,所选用的内存速度也较快,并且采用了动态调度的指令流水线。但是,IBM 360/85的整体性能却高于IBM 360/91,惟一的原因就是前者采用了缓存技术,而后者则没有。
其次是半导体存储器开始代替磁芯存储器。最初,半导体存储器只是在某些机器中被用作缓存,而CDC7600则率先全面采用这种体积更小、速度更快、可以直接寻址的半导体存储器,磁芯存储器从此退出了历史舞台。与此同时,集成电路也出现了,并迅速应用到计算机中。元器件技术的这两大革命性突破,使得Illiac Ⅳ的设计者们在底层硬件以及并行体系结构方面提出的种种改进都大为逊色。
处理器高速发展
1976年Cray-1问世以后,向量计算机从此牢牢地控制着整个高性能计算机市场15年。Cray-1对所使用的逻辑电路进行了精心的设计,采用了我们如今称为RISC的精简指令集,还引入了向量寄存器,以完成向量运算。这一系列技术手段的使用,使Cray-1的主频达到了80MHz。
微处理器随着机器的字长从4位、8位、16位一直增加到32位,其性能也随之显着提高。正是因为看到了微处理器的这种潜力,卡内基·梅隆大学开始在当时流行的DEC PDP-11小型计算机的基础上研制一台由16台PDP-11/40处理机通过交叉开关与16个共享存储器模块相连接而成的共享存储多处理器系统C.mmp。
从20世纪80年代开始,微处理器技术一直在高速前进。稍后又出现了非常适合于SMP方式的总线协议。而伯克利加州大学则对总线协议进行了扩展,提出了Cache一致性问题的处理方案。从此,C.mmp开创出的共享存储多处理器之路越走越宽。现在,这种体系结构已经基本上统治了服务器和桌面工作站市场。
通信机制稳步前进
同一时期,基于消息传递机制的并行计算机也开始不断涌现。20世纪80年代中期,加州理工学院成功地将64个i8086/i8087处理器通过超立方体互连结构连结起来。此后,便先后出现了Intel iPSC系列、INMOS Transputer系列,Intel Paragon以及IBM SP的前身Vulcan等基于消息传递机制的并行计算机。
20世纪80年代末到90年代初,共享存储器方式的大规模并行计算机又获得了新的发展。IBM将大量早期RISC微处理器通过蝶形互连网络连结起来。人们开始考虑如何才能在实现共享存储器缓存一致的同时,使系统具有一定的可扩展性。20世纪90年代初期,斯坦福大学提出了DASH计划,它通过维护一个保存有每一缓存块位置信息的目录结构来实现分布式共享存储器的缓存一致性。后来,IEEE在此基础上提出了缓存一致性协议的标准。
20世纪90年代至今,主要的几种体系结构开始走向融合。
属于数据并行类型的CM-5除大量采用商品化的微处理器以外,也允许用户层的程序传递一些简单的消息。
Cray T3D是一台NUMA结构的共享存储型并行计算机,但是它也提供了全局同步机制、消息队列机制,并采取了一些减少消息传递延迟的技术。
随着微处理器商品化、网络设备的发展以及MPI/PVM等并行编程标准的发布,集群架构的并行计算机出现开始。IBM SP2系列集群系统就是其中的典型代表。在这些系统中,各个节点采用的都是标准的商品化计算机,它们之间通过高速网络连接起来。
1.2 有限元并行计算的发展和现状
目前,在计算力学领域内,围绕着基于变分原理的有限元法
和基于边界积分方程的边界元法,以及基于现在问世的各种并行
计算机,逐渐形成了一个新的学科分支——有限元并行计算。它
是高效能的,使得许多现在应用串行计算机和串行算法不能解决
或求解不好的大型的、复杂的力学问题能得到满意的解答,故其
发展速度十分惊人。在国际上已经掀起了利用并行机进行工程分
析和研究的高潮。从1975到1995年的二十年间,有关有限元方法
和相应的数值并行计算的文章已发表1000余篇。
有限元并行计算正在向两个方向发展。一是对系统方程组实
施并行求解的各种算法。二是并行分析方法,包括有限元并行算
法和边界元并行算法,前者趋向成熟,而后者的研究较少。对这
一方面的研究,是为了挖掘有限元计算自身潜在的并行性,是有
限元并行计算的根本问题。
1.2.1国内
并行算法的设计和有效实现强烈地依赖于并行机的硬软件环
境。国内仅极少数单位拥有并行机,且机型杂乱,因此研究人员
少,起步晚,而且局限于特定的硬件环境。从有限元分析方法的
内容来看,发表的几十篇研究论文(报告)还未显示出较强的系
统性。
1)南京航空航天大学周树荃教授等在YH-1向量机上实现了刚度
矩阵计算、对称带状矩阵的Cholesky分解和线性方程组的求解等
并行处理。针对不规则结构工程分析问题,他们还采用了变带宽
存贮方法,并实现了刚度矩阵的并行计算以及求解变带宽稀疏线
性方程组的并行直接解法【20】。
2)中国科学院计算中心王荩贤研究员等在基于Transputer芯片
的分布式MIMD系统上,提出了有限元分析中变带宽线性方程组的
并行直接解法,初步完成了一个静力分析程序【21】。
3)重庆大学张汝清教授等借助于ELXSI-6400共享存贮器型MIMD
系统,先后开展了范围比较广泛的并行算法研究,主要成果有:
a)提出了静力分析中子结构解法的并行算法,以及动力分析中模
态综合子结构法的并行算法;
b)从波前法出发,发展了多波前并行算法以求解大型结构分析
问题;
c)从Jacobi块迭代法和加权残差法出发,导出了基于异步控制的
有限元方程并行解法和有限元并行迭代的基本格式;
d)利用图论中的着色理论,实现了刚度矩阵的并行计算;
e)实现了基于有色线剖分的SOR并行迭代解法;
f)实现了子空间迭代法、Lanczos法以及利用多项式割线迭代法
和矢量迭代法求解结构固有频率和模态的并行算法;
g)针对弹塑性分析,提出了一种多波前子结构并行算法;
h)针对弹性接触问题,提出了一种基于参数变分原理的并行解法;
i)实现了一步积分法的并行处理【22】。
4)南京航空航天大学乔新教授等借助于Transputer芯片的分布式
MIMD系统实现了有限元方程组的并行直接解法,并提出了基于子结
构的预处理共轭梯度法的并行计算方法【23】。
此外,浙江大学姚坚【24】、中国科学院西南计算中心马寅国、
东北工学院张铁以及国防科技大学六系也曾对有限元分析的并行计
算开展了一些研究。
上述研究结果表明,国内并行计算方法的研究,在硬件上基于
向量机、分布式并行机和共享存贮式并行机;在内容上,似乎面很
广,但系统性和深度还很不够,软件开发距实际应用和商品化还有
很大距离,对不依赖并行机具体环境的通用并行算法研究还很少,
同样对旨在进行结构有限元分析的并行计算的硬件研究也很少。
1.2.2国外
自从美国国家宇航局(NASA)的A.K.Noor于1975年发表第一篇
有限元并行计算的文章以来,有限元并行处理技术几乎与并行计算
机同步发展。距不完全统计,到1992年,国外已发表了400余篇这方
面的论文,其中后5年的文章篇数是前12年的总和。在研究内容上也
由过去的算法研究发展到了算法、软件和硬件相结合的研究,并针对
一些机型开发了一些实用的大型结构分析软件。
1)有限元机器FEM【25】(Finite Element Machine)。早在70年
代末,就有人发表了有关FEM的论文,1982年美国国家宇航局Langley
研究中心的O.O.Storaasli等撰文详细地介绍了该中心设计的供研究
用的FEM。该机器由1个处理器阵列、1台作为控制器的微机和1个并行
操作系统及一些模块化了的通用并行算法程序组成,用户使用系统的
文本编辑器和控制器的其它特殊功能,能建立有限元计算模型并进行
分析。10多年来,又有一些人在这一方面进行了不懈的努力,但FEM
的发展前景仍然不太令人乐观。
2)心动阵列并行机【26】。心动阵列并行机主要应用于信号和图象
的并行处理,但由于其高效的矩阵计算功能,近年来有人把它应用于
有限元分析,并作了一些有益的尝试。
3)巨型向量机【27】。在有限元分析中越来越显示出巨大的威力,
处于领先的是美国思维公司的CM-2。许多结构分析家把这个具有65536
个处理器的巨型向量机应用于有限元计算,如T.Belyschko等人采用显
式方法,完成了具有32768个单元的壳的非线性有限元计算,并行效率
极高,速度几乎比CRAY X-MP/14并行机高出1个数量级。
4)并行机网络和工作站网络【28】。日本东京大学矢川等借助高速网
络把3台CRAY Y-MP机联成网络进行有限元分析,有限元方程求解采用
的是基于区域分裂技术的共轭梯度法(CGM), 在求解三维弹性问题
时自由度个数超过了100万,系统平均运行速度高达1.74GFLOPS。另外,
他们还基于一个工程工作站网络,在并行环境下进行了类似的研究,
求解问题的自由度数高达20万个。
--
我左看右看前看后看可还是看不过来
这个....那个....我越看越奇怪....
不是我不明白,这世界变化快
❻ maprece是一个什么类型的并行计算系统
MapRece是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Rece(规约)",和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。他极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Rece(规约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
了解更多开源相关,去LUPA社区看看吧
❼ 下面哪些组件可以实现管理hbase的运行内存管理
riak 华师大的吧- -
下面来简单介绍各个组件的作用:
HDFS(Hadoop distribute file system)——Hadoop生态系统的基础组件Hadoop分布式文件系统。它是其他一些工具的基础HDFS的机制是将大量数据分布到计算机集群上,数据一次写入,但可以多次读取用于分析。HDFS让Hadoop可以最大化利用磁盘。
HBase—— 一个构建在HDFS之上的面向列的NoSql数据库,HBase用于对打量数据进行快速读取/写入。HBase将Zookeeper用于自身的管理,以保证其所有组件都正在运行。HBase使得Hadoop可以最大化利用内存。
MapRece——MapRece是Hadoop的主要执行框架,它是一个用于分布式并行数据处理的编程模型,将作业分为mapping阶段和rece阶段。开发人员谓Hadoop编写MapRece作业,并使用HDFS中存储的数据,而HDFS可以保证快速的数据访问。鉴于MapRece作业的特性,Hadoop以并行的方式将处理过程移向数据。MapRece使得Hadoop可以最大化利用CPU。
Zookeeper——Zookeeper是Hadoop的分布式协调服务。Zookeeper被设计成可以在机器集群上运行,是一个具有高度可用性的服务,用于Hadoop操作的管理,而且很多Hadoop组件都依赖它。
Oozie—— Oozie是一个北极测很难过到Hadoop软件栈中的可扩展的Workflow系统。用于协调多个MapRece作业的执行。它能够处理大量的复杂性,基于外部事件来管理执行。
Pig——Pig是对MapRece编程复杂性的抽象,Pig平台包含用于分析Hadoop数据集的执行环境和脚本语言(Pig Latin)。它的编译器将Pig Latin翻译为MapRece程序序列。
Hive——类似于SQL的高级语言,用于执行对存储在Hadoop中数据的查询,Hive允许不熟悉MapRece的开发人员编写数据查询语句,它会将翻译为Hadoop中的MapRece作业。类似于Pig。Hive是一个抽象层,适合于较熟悉SQL而不是java编程的数据库分析师。
Hadoop生态系统中还包含一些用于与其他企业级应用进行集成的框架,例如上图所示的Sqoop和Flume:
Sqoop是一个连通性工具,用于在关系型数据库和数据仓库Hadoop之间移动数据。Sqoop利用数据库来描述导入/导出数据的模式,并使用MapRece实现并行操作和容错。
Fulme是一个分布式的、具有可靠性和高可用性的服务,用于从单独的机器上将大量数据高效的收集、聚合并移动到HDFS中。它给予一个简单灵活的架构,童工流式数据操所。它借助于简单可扩展的数据模型,允许将来自企业中多台机器上的数据移到Hadoop中。
❽ Bigtable具体是怎样一个东西
1、针对标题。BigTable是有部分关系模型支持的,更像是表,底层存储是GFS。与Maprece的关系就跟GFS与MapRece的关系没啥区别吧。
2、针对内容问题,没有仔细看storm,但是从大致个人了解来说,storm是一个为支持实时计算的框架。而Hadoop是更适用于批量计算。不太同类,没啥好比较的吧。
BigTable是非关系的数据库,是一个稀疏的、分布式的、持久化存储的多维度排序Map。Bigtable的设计目的是可靠的处理PB级别的数据,并且能够部署到上千台机器上。Bigtable已经实现了下面的几个目标:适用性广泛、可扩展、高性能和高可用性。Bigtable已经在超过60个Google的产品和项目上得到了应用,包括 Google Analytics、GoogleFinance、Orkut、Personalized Search、Writely和GoogleEarth。这些产品对Bigtable提出了迥异的需求,有的需要高吞吐量的批处理,有的则需要及时响应,快速返回数据给最终用户。它们使用的Bigtable集群的配置也有很大的差异,有的集群只有几台服务器,而有的则需要上千台服务器、存储几百TB的数据。
❾ C++问题:
1. C++可以描述为:包括两部分,C和C++。所以,用C++解决问题,无非就是算法与对象。也就是面向过程的算法,以及面象对象的抽象。
2。建议你学习一下面向对象,UML,设计模式等。
3。解决此问题,你可以按着C的思考方式,只不过就是在那个基础上,将它封装成类。
4。你说的那些都是C++标准库中的,也就是STL,你可以搜索一下STL方面的书。
5。这个。。。不知道你要哪方面的,你想干什么。我现在正在写个指针,就把这个先粘上吧。
template<typename _DLG,typename _DATA>
struct TPage
{
typedef TPage<typename _DLG,typename _DATA> _ThisType;
_DLG * _p;
int _nRef;
TPage()
{
_p=NULL;
_nRef=0;
}
~TPage()
{
if(_p)
{
_p->DestroyWindow();
delete _p;
_p=NULL;
if(_nRef)
{
nRef--;
}
}
}
void Initial(_DATA datatype,CWnd* pWnd)
{
CRect rect;
pWnd->GetWindowRect(rect);
_p=new _DLG(pWnd);
_p->SetData(datatype);
_p->Create(_DLG::IDD,pWnd);
CRect rectX;
GetWindowRect(_p->GetSafeHwnd(),rectX);
int nWidth=rectX.Width();
int nHeight=rectX.Height();
rectX.left=rect.left+(rect.Width()-rectX.Width())/2;
rectX.right=rectX.left+nWidth;
rectX.top=rect.top+(rect.Height()-nHeight)/2;
rectX.bottom=rect.top+nHeight;
_p->MoveWindow(rectX);
_p->ShowWindow(nRef?SW_HIDE:SW_SHOW);
nRef++;
_nRef=nRef;
}
void Initial(_DATA datatype,CRect rect,CWnd* pWnd)
{
_p=new _DLG(pWnd);
_p->SetData(datatype);
_p->Create(_DLG::IDD,pWnd);
CRect rectX;
GetWindowRect(_p->GetSafeHwnd(),rectX);
int nWidth=rectX.Width();
int nHeight=rectX.Height();
rectX.left=rect.left+(rect.Width()-rectX.Width())/2;
rectX.right=rectX.left+nWidth;
rectX.top=rect.top+(rect.Height()-nHeight)/2;
rectX.bottom=rect.top+nHeight;
_p->MoveWindow(rectX);
_p->ShowWindow(nRef?SW_HIDE:SW_SHOW);
nRef++;
}
_DLG * operator -> ()
{
return _p;
}
_ThisType& operator =(_ThisType & _t)
{
_p=_t._p;
return *this;
}
void SaveData(int nWhich)
{
if (nWhich==_nRef-1 && nWhich!=-1)
{
_p->SaveData();
}
}
};
我要做一个对话框的布局。我感觉太麻烦,于是写了这么个东西,用处不太大,相当于智能指针。你先将就看吧。