<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; 博客征文专栏</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/category/blog-contest/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 06 Feb 2012 03:24:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 13:59:10 +0000</pubDate>
		<dc:creator>Dawei Cheng 程大伟 (Intel)</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[Android x86]]></category>
		<category><![CDATA[Android开发]]></category>
		<category><![CDATA[英特尔架构]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/</guid>
		<description><![CDATA[如何设置您的NDK应用 本篇主要介绍NDK应用的开发步骤，调试流程已经如何为英特尔架构设置您的NDK应用。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特尔架构的Android应用(二) NDK应用介绍 •3. 开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用 •1. NDK应用开发步骤 NDK应用的开发流程主要分为五个步骤： •1、 准备好本地代码 •2、 编写makefile文件，mk文件 •3、 编译本地代码（需要添加X86支持选项）为库文件（so） •4、 从Java端调用本地代码 •5、 用gdb来调试本地代码 通过以上五个步骤后，应用程序调用流程如下图所示：Android App通过Java Framework调用Java SDK API, 通过JNI调用本地库文件。 •2. 创建本地代码和编写makefile文件 在Android工程的jni文件夹下面创建本例中使用的本地代码hello-jni.c 以及Android.mk，代码如下图所示。 注意，在Android.mk文件中要添加X86的支持项。 •3. 编译本地代码（需要添加X86支持选项）为库文件（so） 进入工程所在目录，运行ndk-build来编译本地代码，运行效果如下次，会分别为ARM和X86生成相应的so文件，从java调用本地代码如下图红色标出所示。 •4. 调试流程 调试流程的要求以及调试过程如下图，需要注意的是在manifest文件中需要设置android:debuggable="true"； 然后使用ndk-gdb来调试即可。 本篇完。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特尔架构的Android应用(二) NDK应用介绍 •3. 开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用]]></description>
			<content:encoded><![CDATA[<p align="left"><b><br /></b><b></b></p>
<p align="left"><b>如何设置您的</b><b>NDK</b><b>应用</b><b></b></p>
<p align="left">本篇主要介绍NDK应用的开发步骤，调试流程已经如何为英特尔架构设置您的NDK应用。</p>
<p align="left"><b><b>相关文章</b></b></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p>
<p align="left"><b><br />•1.    </b><b>NDK</b><b>应用开发步骤</b><b></b></p>
<p align="left">NDK应用的开发流程主要分为五个步骤：</p>
<p align="left">•1、  准备好本地代码</p>
<p align="left">•2、  编写makefile文件，mk文件</p>
<p align="left">•3、  编译本地代码（需要添加X86支持选项）为库文件（so）</p>
<p align="left">•4、  从Java端调用本地代码</p>
<p align="left">•5、  用gdb来调试本地代码</p>
<p align="left">通过以上五个步骤后，应用程序调用流程如下图所示：Android App通过Java Framework调用Java SDK API, 通过JNI调用本地库文件。</p>
<p align="left"> <img height="254" width="470" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/21.jpg" /></p>
<p align="left"><b>•2.    </b><b>创建本地代码和编写</b><b>makefile</b><b>文件</b><b></b></p>
<p align="left">在Android工程的jni文件夹下面创建本例中使用的本地代码hello-jni.c 以及Android.mk，代码如下图所示。 注意，在Android.mk文件中要添加X86的支持项。</p>
<p align="left"> <img height="273" width="485" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/22.jpg" /></p>
<p align="left"><b>•3.    </b><b>编译本地代码（需要添加</b><b>X86</b><b>支持选项）为库文件（</b><b>so</b><b>）</b><b></b></p>
<p align="left">进入工程所在目录，运行ndk-build来编译本地代码，运行效果如下次，会分别为ARM和X86生成相应的so文件，从java调用本地代码如下图红色标出所示。</p>
<p align="left"> <img height="257" width="507" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/23.jpg" /></p>
<p align="left"><b>•4.    </b><b>调试流程</b><b></b></p>
<p align="left">调试流程的要求以及调试过程如下图，需要注意的是在manifest文件中需要设置android:debuggable="true"； 然后使用ndk-gdb来调试即可。</p>
<p align="left"> <img height="296" width="505" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/24.jpg" /></p>
<p align="left"> 本篇完。</p>
<p>相关文章</p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开发兼容英特尔架构的Android应用(二) NDK应用介绍</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 13:56:43 +0000</pubDate>
		<dc:creator>Dawei Cheng 程大伟 (Intel)</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[Android x86]]></category>
		<category><![CDATA[Android开发]]></category>
		<category><![CDATA[英特尔架构]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/</guid>
		<description><![CDATA[NDK应用介绍 本篇主要介绍NDK应用的架构，运行机制以及代码结构。。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特尔架构的Android应用(二) NDK应用介绍 •3. 开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用 •1. NDK 介绍 NDK在安卓官方解释为：NDK(Native Development Kit) is a toolset that lets you embed components that make use of native code in your Android applications。是一个本地代码开发套件，通过JNI（Java Native Interface）Java本地接口机制来供Java代码调用。 •2. NDK 应用结构 一个典型的NDK 应用如下图所示，包含四个部分：Android Manifest，Dalvik Classes（Java代码），资源文件和JNI调用的本地库（so文件）。 •3. NDK 应用调用过程 NDK应用调用过程可以简单地用下面这张从网上摘录的图表示。所有的本地代码（C/C++）等等通过Android Makefile文件编译为动态库文件，Java Classes通过JNI接口去调用动态库。 •4. NDK API Android [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><b>NDK应用介绍</b><b></b></p>
<p align="left">本篇主要介绍NDK应用的架构，运行机制以及代码结构。。</p>
<p><b></p>
<p align="left"><b><br />相关文章</b></p>
<p></b></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p>
<p align="left"> <b><br /></b></p>
<p align="left"><b>•1.    </b><b>NDK </b><b>介绍</b><b></b></p>
<p align="left">NDK在安卓官方解释为：NDK(Native Development Kit) is a toolset that lets you embed components that make use of native code in your Android applications。是一个本地代码开发套件，通过JNI（Java Native Interface）Java本地接口机制来供Java代码调用。</p>
<p align="left"><b>•2.    </b><b>NDK </b><b>应用结构</b><b></b></p>
<p align="left">一个典型的NDK 应用如下图所示，包含四个部分：Android Manifest，Dalvik Classes（Java代码），资源文件和JNI调用的本地库（so文件）。</p>
<p align="left"> <img height="169" width="266" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/11.jpg" /></p>
<p align="left"><b>•3.    </b><b>NDK </b><b>应用调用过程</b><b></b></p>
<p align="left">NDK应用调用过程可以简单地用下面这张从网上摘录的图表示。所有的本地代码（C/C++）等等通过Android Makefile文件编译为动态库文件，Java Classes通过JNI接口去调用动态库。</p>
<p align="left"> <img height="306" width="440" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/12.jpg" /></p>
<p align="left"><b>•4.    </b><b>NDK API</b></p>
<p align="left">Android NDK同样提供了一些本地的API供开发者调用，如libc，libm等等，如果你的库是来自于linux项目，那么将相应的库做一些移植工作即可，比如讲glib相应的参数移至libc下面等等。</p>
<p align="left">•l   libc (C library) headers</p>
<p align="left">•l   libm (math library) headers</p>
<p align="left">•l   JNI interface headers</p>
<p align="left">•l   libz (Zlib compression) headers</p>
<p align="left">•l   liblog (Android logging) header</p>
<p align="left">•l   OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers</p>
<p align="left">•l   libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).</p>
<p align="left">•l   A Minimal set of headers for C++ support</p>
<p align="left">•l   OpenSL ES native audio libraries</p>
<p align="left">•l   Android native application APIS</p>
<p align="left">
<p align="left">
<p>本篇完。</p>
<p>相关文章</p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开发兼容英特尔架构的Android应用(一)</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 13:50:34 +0000</pubDate>
		<dc:creator>Dawei Cheng 程大伟 (Intel)</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[Android x86]]></category>
		<category><![CDATA[Android应用开发]]></category>
		<category><![CDATA[英特尔架构]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/</guid>
		<description><![CDATA[开篇介绍 本系列博客将主要介绍Android应用架构，如何让开发兼容英特尔架构的Android应用，在接下来将重点介绍NDK应用的开发方式，以及如何让带有NDK的应用兼容英特尔架构。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特尔架构的Android应用(二) NDK应用介绍 •3. 开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用 •1. 首款英特尔架构手机概述 在2012年1月举办的国际消费电子展(CES)上，英特尔携手联想发布第一款Intel芯智能手机K800，据报道，联想资深副总裁暨移动网际网络与数字家庭部门总裁刘军表示，K800智能手机将于第二季在中国上市，内含新款Atom处理器的数款智能手机将于2012年陆续问世。此外，Intel还与摩托罗拉移动达成为期数年的移动领域战略合作协议，后者的智能手机将采用Intel的Atom处理器及Android平台。 作为英特尔架构的首款手机，K800一问世即引起围观，接下来将主要介绍Android应用架构，如何让开发兼容英特尔架构的Android应用，在第二篇中将重点介绍NDK应用的开发方式，以及如何让带有NDK的应用兼容英特尔架构。 •2. Android开发 Android开发总体分为三个层次：移植手机系统（底层），系统开发（中间层）和应用开发（上层）。 那么哪些工作是需要针对英特尔平台做适配的呢。我们从上图可以看到，只要在Android Runtime及Java虚拟机至上运行的程序，在英特尔平台上可以直接运行，无需适配。但是如果您的应用或者代码是运行在Java 虚拟机之外的，就需要针对英特尔平台做适配工作了。 •3. 移植手机系统（底层） 移植手机系统工作主要在于驱动的适配，如下图所示。如果您是从事此块工作的工程师，您的代码需要使用X86架构的编译器进行编译才可以在英特尔架构手机上面运行。如果程序中有汇编指令，同样需要做平台的适配工作，ARM的Neon指令需要转变为英特尔Atom架构的SSSE指令系统。 •4. 系统开发（中间层） 系统开发（中间层）工作主要包括： •• 增加C或者C++本地库； •• 将所需要的代码封装成JNI； •• 定义Java层所需要的类（系统API）； •• 结合Java类和JNI； •• 应用程序调用Java类。 如下图所示。 在这一层开发的工程师只需要将第一步，增加C/C++代码库的部分添加进支持X86的库文件就可以。也就是在编译时，Android Makefile文件中添加： APP_ABI := armeabi armeabi-v7a x86 代码即可。其他步骤相同。 •5. 应用开发 应用开发分为Java应用和NDK应用： Java应用及运行在Java虚拟机之上的应用无需为英特尔平台做任何适配工作即可运行（屏幕尺寸适配仍然是必须的）。 NDK应用需要进行适配工作，在下篇中会详细介绍。 本篇完。 相关文章 •1. [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><b>开篇介绍</b><b></b></p>
<p align="left">本系列博客将主要介绍Android应用架构，如何让开发兼容英特尔架构的Android应用，在接下来将重点介绍NDK应用的开发方式，以及如何让带有NDK的应用兼容英特尔架构。</p>
<p><b></p>
<p align="left"><b><br />相关文章</b></p>
<p></b></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p>
<p align="left"> <b><br />•1.    </b><b>首款英特尔架构手机概述</b><b></b></p>
<p align="left">在2012年1月举办的国际消费电子展(CES)上，英特尔携手联想发布第一款Intel芯智能手机K800，据报道，联想资深副总裁暨移动网际网络与数字家庭部门总裁刘军表示，K800智能手机将于第二季在中国上市，内含新款Atom处理器的数款智能手机将于2012年陆续问世。此外，Intel还与摩托罗拉移动达成为期数年的移动领域战略合作协议，后者的智能手机将采用Intel的Atom处理器及Android平台。</p>
<p align="left">作为英特尔架构的首款手机，K800一问世即引起围观，接下来将主要介绍Android应用架构，如何让开发兼容英特尔架构的Android应用，在第二篇中将重点介绍NDK应用的开发方式，以及如何让带有NDK的应用兼容英特尔架构。</p>
<p align="left"><b><br />•2.    </b><b>Android</b><b>开发</b><b></b></p>
<p align="left">Android开发总体分为三个层次：移植手机系统（底层），系统开发（中间层）和应用开发（上层）。</p>
<p align="left"><img height="273" width="519" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/011.jpg" /> </p>
<p align="left">
<p align="left">那么哪些工作是需要针对英特尔平台做适配的呢。我们从上图可以看到，只要在Android Runtime及Java虚拟机至上运行的程序，在英特尔平台上可以直接运行，无需适配。但是如果您的应用或者代码是运行在Java 虚拟机之外的，就需要针对英特尔平台做适配工作了。</p>
<p align="left"><b><br />•3.    </b><b>移植手机系统（底层）</b><b></b></p>
<p align="left">移植手机系统工作主要在于驱动的适配，如下图所示。如果您是从事此块工作的工程师，您的代码需要使用X86架构的编译器进行编译才可以在英特尔架构手机上面运行。如果程序中有汇编指令，同样需要做平台的适配工作，ARM的Neon指令需要转变为英特尔Atom架构的SSSE指令系统。</p>
<p align="left"> <img height="205" width="488" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/021.jpg" /></p>
<p align="left">
<p align="left"><b>•4.    </b><b>系统开发（中间层）</b><b></b></p>
<p align="left">系统开发（中间层）工作主要包括：</p>
<p align="left">••    增加C或者C++本地库；</p>
<p align="left">••    将所需要的代码封装成JNI；</p>
<p align="left">••    定义Java层所需要的类（系统API）；</p>
<p align="left">••    结合Java类和JNI；</p>
<p align="left">••    应用程序调用Java类。</p>
<p align="left">如下图所示。 <br /><img height="309" width="521" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/031.jpg" /></p>
<p>在这一层开发的工程师只需要将第一步，增加C/C++代码库的部分添加进支持X86的库文件就可以。也就是在编译时，Android Makefile文件中添加：</p>
<p align="center">APP_ABI := armeabi armeabi-v7a<b> x86</b></p>
<p align="left">代码即可。其他步骤相同。</p>
<p align="left"><b>•5.    </b><b>应用开发</b><b></b></p>
<p align="left">应用开发分为Java应用和NDK应用：</p>
<p align="left">Java应用及运行在Java虚拟机之上的应用无需为英特尔平台做任何适配工作即可运行（屏幕尺寸适配仍然是必须的）。</p>
<p align="left">NDK应用需要进行适配工作，在下篇中会详细介绍。</p>
<p align="left"> <img height="113" width="401" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/041.jpg" /></p>
<p align="left">本篇完。</p>
<p>相关文章</p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/">•1.     开发兼容英特尔架构的Android应用(一) 应用架构介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk/">•2.     开发兼容英特尔架构的Android应用(二) NDK应用介绍</a></p>
<p align="left"><a href="http://software.intel.com/zh-cn/blogs/2012/01/30/android-ndk-2/">•3.     开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/30/android-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazed 游戏学习二 坐标的分析</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/13/amazed/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/13/amazed/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:33:05 +0000</pubDate>
		<dc:creator>gaomatrix</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/13/amazed/</guid>
		<description><![CDATA[对于这种和贪吃蛇类似的游戏，坐标的计算在程序中占了很大的比重，只有坐标算对了，才能在正确的时间、正确的地点画出来正确的东西。 下面是Maze迷宫的坐标计算 01.// maze level data 02.private static int[] mMazeData; 这个一维数组存放所有的tile的类型 01.// maze tile size and dimension 02.private final static int TILE_SIZE = 16; 03.private final static int MAZE_COLS = 20; 04.private final static int MAZE_ROWS = 26; 01.// tile types 02.public final static int PATH_TILE = 0; 03.public final static int VOID_TILE = 1;//death [...]]]></description>
			<content:encoded><![CDATA[<p>对于这种和贪吃蛇类似的游戏，坐标的计算在程序中占了很大的比重，只有坐标算对了，才能在正确的时间、正确的地点画出来正确的东西。</p>
<p>下面是Maze迷宫的坐标计算<br />
01.// maze level data<br />
02.private static int[] mMazeData;</p>
<p>这个一维数组存放所有的tile的类型<br />
01.// maze tile size and dimension<br />
02.private final static int TILE_SIZE = 16;<br />
03.private final static int MAZE_COLS = 20;<br />
04.private final static int MAZE_ROWS = 26;</p>
<p>01.// tile types<br />
02.public final static int PATH_TILE = 0;<br />
03.public final static int VOID_TILE = 1;//death area<br />
04.public final static int EXIT_TILE = 2;//the target<br />
而这个坐标的读取是通过从文件读取的，当然也可以通过写几个数组的形式，但是以文件的形式的话就不需要修改代码就可以实现软件的修改是一种比在代码中写几个大的数组要好的形式。</p>
<p>01./**<br />
02. * Load specified maze level.<br />
03. *<br />
04. * @param activity<br />
05. * Activity controlled the maze, we use this load the level data<br />
06. * @param newLevel<br />
07. * Maze level to be loaded.<br />
08. */<br />
09. void load(Activity activity, int newLevel) {<br />
10. // maze data is stored in the assets folder as level1.txt, level2.txt<br />
11. // etc....<br />
12. String mLevel = "level" + newLevel + ".txt";<br />
13.<br />
14. InputStream is = null;<br />
15.<br />
16. try {<br />
17. // construct our maze data array.<br />
18. mMazeData = new int[MAZE_ROWS * MAZE_COLS];<br />
19. // attempt to load maze data.<br />
20. is = activity.getAssets().open(mLevel);<br />
21.<br />
22. // we need to loop through the input stream and load each tile for<br />
23. // the current maze.<br />
24. for (int i = 0; i &lt; mMazeData.length; i++) {<br />
25. // data is stored in unicode so we need to convert it.<br />
26. mMazeData[i] = Character.getNumericValue(is.read());<br />
27.<br />
28. // skip the "," and white space in our human readable file.<br />
29. is.read();<br />
30. is.read();<br />
31. }<br />
32. } catch (Exception e) {<br />
33. Log.i("Maze", "load exception: " + e);<br />
34. } finally {<br />
35. closeStream(is);<br />
36. }<br />
37. }<br />
mMazeData数组存放了每个tile是什么类型的，MAZE_ROWS一共有多少行，MAZE_COLS一共多少列，TILE_SIZE每个tile的宽度，这样就可以在界面上画出来整个界面的布局</p>
<p>01./**<br />
02. * Draw the maze.<br />
03. *<br />
04. * @param canvas<br />
05. * Canvas object to draw too.<br />
06. * @param paint<br />
07. * Paint object used to draw with.<br />
08. */<br />
09. public void draw(Canvas canvas, Paint paint) {<br />
10. // loop through our maze and draw each tile individually.<br />
11. for (int i = 0; i 0)<br />
22. mLocation = mCellRow * MAZE_COLS;<br />
23.<br />
24. // add the column location.<br />
25. mLocation += mCellCol;<br />
26.<br />
27. return mMazeData[mLocation];<br />
28. }<br />
/**<br />
* Determine which cell the marble currently occupies.<br />
*<br />
* @param x<br />
* Current x co-ordinate of marble on the screen.<br />
* @param y<br />
* Current y co-ordinate of marble on the screen.<br />
* @return The actual cell occupied by the marble.<br />
*/<br />
public int getCellType(int x, int y) {<br />
// convert the x,y co-ordinate into row and col values.<br />
int mCellCol = x / TILE_SIZE;<br />
int mCellRow = y / TILE_SIZE;</p>
<p>// location is the row,col coordinate converted so we know where in the<br />
// maze array to look.<br />
int mLocation = 0;</p>
<p>// if we are beyond the 1st row need to multiple by the number of<br />
// columns.<br />
if (mCellRow &gt; 0)<br />
mLocation = mCellRow * MAZE_COLS;</p>
<p>// add the column location.<br />
mLocation += mCellCol;</p>
<p>return mMazeData[mLocation];<br />
}下面是Marble小球的坐标计算</p>
<p>01.// marble attributes<br />
02.// x,y are private because we need boundary checking on any new values to<br />
03.// make sure they are valid.<br />
04.private int mX = 0;<br />
05.private int mY = 0;<br />
06.private int mRadius = 8;<br />
07.private int mColor = Color.WHITE;<br />
08.private int mLives = 5;</p>
<p>在AmazedView中的onDraw()调用gameTick()的时候会更新小球Marble的坐标：</p>
<p>01./**<br />
02. * Called from gameTick(), update marble x,y based on latest values obtained<br />
03. * from the Accelerometer sensor. AccelX and accelY are values received from<br />
04. * the accelerometer, higher values represent the device tilted at a more<br />
05. * acute angle.<br />
06. */<br />
07. public void updateMarble() {<br />
08. // we CAN give ourselves a buffer to stop the marble from rolling even<br />
09. // though we think the device is "flat".<br />
10. if (mAccelX &gt; mSensorBuffer || mAccelX mSensorBuffer || mAccelY 0) {<br />
19. // user still has some lives remaining, restart the level.<br />
20. mMarble.death();<br />
21. mMarble.init();<br />
22. mWarning = true;<br />
23. } else {<br />
24. // user has no more lives left, end of game.<br />
25. mEndTime = System.currentTimeMillis();<br />
26. mTotalTime += mEndTime - mStartTime;<br />
27. switchGameState(GAME_OVER);<br />
28. }<br />
29.<br />
30. } else if (mMaze.getCellType(mMarble.getX(), mMarble.getY()) == mMaze.EXIT_TILE) {<br />
31. // user has reached the exit tiles, prepare the next level.<br />
32. mEndTime = System.currentTimeMillis();<br />
33. mTotalTime += mEndTime - mStartTime;<br />
34. initLevel();<br />
35. }<br />
36. }</p>
<p>在Marble中更新小球坐标：</p>
<p>01./**<br />
02. * Attempt to update the marble with a new x value, boundary checking<br />
03. * enabled to make sure the new co-ordinate is valid.<br />
04. *<br />
05. * @param newX<br />
06. * Incremental value to add onto current x co-ordinate.<br />
07. */<br />
08. public void updateX(float newX) {<br />
09. mX += newX;<br />
10.<br />
11. // boundary checking, don't want the marble rolling off-screen.<br />
12. if (mX + mRadius &gt;= mView.getWidth())<br />
13. mX = mView.getWidth() - mRadius;<br />
14. else if (mX - mRadius &lt; 0)<br />
15. mX = mRadius;<br />
16. }</p>
<p>if-else中是对左右边界的处理，同样的是对上下边界的处理。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/13/amazed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi 多线程知识</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/13/delphi-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/13/delphi-2/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:32:11 +0000</pubDate>
		<dc:creator>formiss</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/13/delphi-2/</guid>
		<description><![CDATA[1-1 多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统，也就是：一个进程可以划分为多个线程，每个线程轮流占用CPU 运行时间和资源，或者说，把CPU 时间划成片，每个片分给不同的线程，这样，每个线程轮流的“挂起”和“唤醒”，由于时间片很小，给人的感觉是同时运行的。 多线程带来如下好处：（自己阅读） 1）避免瓶颈； 2）并行操作； 3）提高效率； 在多线程中，通过优先级管理，可以使重要的程序优先操作，提高了任务管理的灵活性。 另一方面，在多CPU 系统中，可以把不同的线程在不同的CPU 中执行，真正做到同时处理多任务（Win 98 只是模拟的，而Win/NT/2000是真正的多CPU同时操作）。 多线程的两个概念： 1）进程：也称任务，程序载入内存，并分配资源，称为“一个进程”。 注意：进程本身并不一定要正在执行。进程由以下几部分组成： a&#62;一个私有的地址空间，它是进程可以使用的一组虚拟内存地址空间； b&#62;程序的相关代码、数据源； c&#62;系统资源，比如操作系统同步对象等； d&#62;至少包含一个线程（主线程）； 2）线程：是程序的执行单位（线程本身并不包括程序代码，真正拥有代码的是进程），每个进程至少包括一个线程，称为主线程，一个进程如果有多个线程，就可以共享同一进程的资源，并可以并发执行。 线程是进程的一个执行单元，是操作系统分配CPU 时间的基本实体，线程主要由如下两部分组成： a&#62;数据结构； b&#62;CPU 寄存器和堆栈； 一个进程中的线程，可以独立运行，也可以控制另一个线程的运行。 请注意： 多线程不能滥用，书上提到了多线程的几个缺点（自阅）。 1-2 Tthread 对象 虽然Windows 提供了比较多的多线程设计的API 函数，但是直接使用API 函数一方面极其不方便，而且使用不当还容易出错。为解决这个问题，Borland 公司率先推出了一种Tthread 对象，来解决多线程设计上的困难，简化了多线程问题的处理。 应该注意，Tthread 对象是没有实例的，它和界面的交流，主要依靠主窗体（主VCL线程），这和其他对象使用上有些区别。 一、Tthread 对象的主要方法 构造线程： constructor Create(CreateSuspended:boolean) 其中：CreateSuspended=true 构造但不唤醒 false 构造的同时即唤醒 也可以用如下方法 inheried [...]]]></description>
			<content:encoded><![CDATA[<p>1-1 多线程的基本概念</p>
<p>WIN 98/NT/2000/XP 是个多任务操作系统，也就是：一个进程可以划分为多个线程，每个线程轮流占用CPU 运行时间和资源，或者说，把CPU 时间划成片，每个片分给不同的线程，这样，每个线程轮流的“挂起”和“唤醒”，由于时间片很小，给人的感觉是同时运行的。<br />
多线程带来如下好处：（自己阅读）<br />
1）避免瓶颈；<br />
2）并行操作；<br />
3）提高效率；<br />
在多线程中，通过优先级管理，可以使重要的程序优先操作，提高了任务管理的灵活性。<br />
另一方面，在多CPU 系统中，可以把不同的线程在不同的CPU 中执行，真正做到同时处理多任务（Win 98 只是模拟的，而Win/NT/2000是真正的多CPU同时操作）。</p>
<p>多线程的两个概念：</p>
<p>1）进程：也称任务，程序载入内存，并分配资源，称为“一个进程”。<br />
注意：进程本身并不一定要正在执行。进程由以下几部分组成：<br />
a&gt;一个私有的地址空间，它是进程可以使用的一组虚拟内存地址空间；<br />
b&gt;程序的相关代码、数据源；<br />
c&gt;系统资源，比如操作系统同步对象等；<br />
d&gt;至少包含一个线程（主线程）；</p>
<p>2）线程：是程序的执行单位（线程本身并不包括程序代码，真正拥有代码的是进程），每个进程至少包括一个线程，称为主线程，一个进程如果有多个线程，就可以共享同一进程的资源，并可以并发执行。<br />
线程是进程的一个执行单元，是操作系统分配CPU 时间的基本实体，线程主要由如下两部分组成：<br />
a&gt;数据结构；<br />
b&gt;CPU 寄存器和堆栈；<br />
一个进程中的线程，可以独立运行，也可以控制另一个线程的运行。</p>
<p>请注意：<br />
多线程不能滥用，书上提到了多线程的几个缺点（自阅）。</p>
<p>1-2 Tthread 对象</p>
<p>虽然Windows 提供了比较多的多线程设计的API 函数，但是直接使用API 函数一方面极其不方便，而且使用不当还容易出错。为解决这个问题，Borland 公司率先推出了一种Tthread 对象，来解决多线程设计上的困难，简化了多线程问题的处理。<br />
应该注意，Tthread 对象是没有实例的，它和界面的交流，主要依靠主窗体（主VCL线程），这和其他对象使用上有些区别。</p>
<p>一、Tthread 对象的主要方法</p>
<p>构造线程：</p>
<p>constructor Create(CreateSuspended:boolean)</p>
<p>其中：CreateSuspended=true 构造但不唤醒<br />
false 构造的同时即唤醒</p>
<p>也可以用如下方法</p>
<p>inheried Create(CreateSuspended:boolean)</p>
<p>挂起线程：</p>
<p>suspend</p>
<p>（把线程挂起的次数加一）</p>
<p>唤醒线程：</p>
<p>resume</p>
<p>（注意：注意这个属性是把线程挂起的次数减一，当次数为0 时，即唤醒。也就是说，线程挂起多少次，唤醒也需要多少次。同时挂起的时候将保持线程的地址指针不变，所以线程挂起后再唤醒，将从挂起的地方开始运行）</p>
<p>析构（清除线程所占用的内存）：</p>
<p>destroy</p>
<p>终止线程（后面会具体讨论）:</p>
<p>Terminate</p>
<p>二、线程应用的简单例子：</p>
<p>下面通过一个例子说明上述方法的应用。我们知道，循环是独占性最强的运行方式之一，现在希望建立两个线程对象，实现循环的并行运行。具体方法如下：</p>
<p>File---New---Thread Object</p>
<p>这就自动在主Form中建立了一个线程单元（在对话框里写上线程名字），默认的名字是Unit2。同样方法建立第二个线程单元Unit3。</p>
<p>要注意的是：Unit2和Unit3中有一个给定的过程：</p>
<p>procedure Object.Execute;<br />
begin</p>
<p>end;</p>
<p>其中的程序是线程唤醒后自动执行的程序，也可以在里面调用其他自定义的过程和函数。这个过程的结束，意味着线程程序的结束。<br />
为了构造线程，在interface的Type区，定义一个构造过程：</p>
<p>type<br />
Object = class(TThread) //自动给出的，也可以直接改</p>
<p>private</p>
<p>protected</p>
<p>procedure Execute; override;</p>
<p>public<br />
constructor create; //自己写的</p>
<p>并且在implementation区域写上：</p>
<p>constructor Object.create;<br />
begin<br />
inherited create(true);<br />
end</p>
<p>其中Object 为线程对象的名字。所以这么写，是希望在主Form中调用这个构造过程。<br />
Create()的参数用True，表明构造出的线程为挂起状态。<br />
注意一下，在同一个线程对象里，如果两次构造，将产生两个独立的线程，不但运行是独立的，而且使用线程的局部变量也是独立的。但这里为了简化问题，还是建立了两个独立的线程对象，而且两个循环数<br />
是不同的，在并行运算时容易判断出是两个不同的程序在运行。</p>
<p>假定我们给两个线程对象起的名字是：</p>
<p>mymath1<br />
mymath2</p>
<p>这样在Unit1，应该作如下声明：</p>
<p>implementation</p>
<p>{$R *.DFM}</p>
<p>uses unit2,unit3;</p>
<p>var thread1:mymath1;<br />
thread2:mymath2;</p>
<p>这样在主线程，将可以通过这两个线程变量调用对应的线程方法。</p>
<p>在主线程区构造线程的方法是：</p>
<p>thread1:=mymath1.create;<br />
thread2:=mymath2.create;</p>
<p>挂起：</p>
<p>thread1.suspend;<br />
thread2.suspend;</p>
<p>唤醒：</p>
<p>thread1.resume;<br />
thread2.resume;</p>
<p>析构：</p>
<p>thread1.destroy;<br />
thread2.destroy;</p>
<p>这里需要说明的是，由于线程单元需要调用Form的Edit控件（对象），可以采用两种方法：</p>
<p>1）在线程单元定义一个TEdit对象，例如</p>
<p>edit4:Tedit;</p>
<p>在Execute过程内直接引用</p>
<p>但在Unit1中一定要在FormCreate过程里作一个赋值：</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
thread1.edit4:=edit1;<br />
end;</p>
<p>这样，就把第一线程的edit4与Form上的edit1联系来。</p>
<p>2）在第二个线程中首先声明调用Unti1，也就是要加上<br />
Uses Unit1;</p>
<p>这样就可以在该线程单元直接调用主Form的控件了，比如在Unit3中可以写：</p>
<p>form1.edit2.text:=inttostr(i)</p>
<p>了解了这些基本规则，就可以写出比较复杂的多线程程序了。<br />
还有一点要说明的，默认生成的线程单元，调用的单元只有一个：</p>
<p>Uses Classes;</p>
<p>这样，往往很多函数和对象在线程单元里不能使用，所以在必要时，应该根据需要User相应的单元，这个例程为了简单，把大部分常用的单元都拷过去了，这并不是推荐的办法，因为这样一来会使程序的垃圾过<br />
多，所以，一般要用什么拷什么。</p>
<p>三、常用的API 函数</p>
<p>在处理多线程问题的时候,也经常用到Windows提供的API 函数，需要说明的是，Tthread 对象内部封装的方法，其实主要也是调用API 函数，但是，考虑更全面，更安全。而直接调用API 函数，往往会因为运用不当，出现一些不应有的错误。所以，我个人以为，只要用Tthread 对象的方法能解决的，就不要直接调用API 函数，API 函数只应该在用在Tthread 对象方法解决不了的时候。<br />
例如Tthread 对象方法内部调用API 函数的时候，一般使用推荐的默认值，但需要更精细的控制时，就可以直接使用API 函数。<br />
其实，Tthread 对象方法已经受到了大多数程序设计者的认可，比如，原来VB是不具备直接处理多线程的能力的，但是，现在VB.Net就宣称，它具备了简单处理多线程问题的能力，这就很说明问题。<br />
下面简单介绍几种API 函数，为了清晰方便，这里着重在于说明，函数正确的描述可以自己阅读书上的例子和手册：<br />
构建线程：</p>
<p>CreateThread(参数1，--安全属性（一般=Nil，默认安全属性）</p>
<p>参数2，--线程堆栈尺寸（一般=0，与主线程相同长度，而且可以根据需要自动变化）<br />
参数3，--指向函数名指针，@函数名，这个参数十分重要，不正确将无法调用成功。<br />
参数4，--用户需要向线程传递的参数，是一个指向结构的指针，不需传递参数时，为Nil。<br />
参数5）--传入与线程有关的一些参数，例如：<br />
CREATE_SUSPENDED 创建一个挂起的线程；<br />
0 创建后立即激活。</p>
<p>书上有这个函数应用的十分清晰的例子，可以自己阅读。<br />
一般并不推荐使用 CreateTheard函数，而推荐使用RTL 库里的System单元中定义的 BeginTheard函数，因为这除了能创建一个线程和一个入口函数以外，还增加了几项保护措施，具体的请参阅书上的第10页说明。</p>
<p>对应suspend（挂起）和resume（唤醒）的两个API 函数为：</p>
<p>Function SuspendThread(hThread:Thandle):DWORD;</p>
<p>Function ResumeThread（hThread:Thandle):DWORD;</p>
<p>其中，Thandle被要求控制线程的句柄，函数调用成功，返回挂起的次数，调用不成功。则返回0xFFFFFFFF。</p>
<p>四、线程的终止和退出：</p>
<p>1)自动退出：</p>
<p>一个线程从Execute()过程中退出，即意味着线程的终止，此时将调用Windows的ExitThread()函数来清除线程所占用的堆栈。<br />
如果线程对象的 FreeOnTerminate 属性设为True，则线程对象将自动删除，并释放线程所占用的资源。<br />
这是消除线程对象最简单的办法。</p>
<p>2)受控退出：</p>
<p>利用线程对象的Terminate属性，可以由进程或者由其他线程控制线程的退出。只需要简单的调用该线程的Terminate方法，并设直线程对象的Terminate属性为True。<br />
在线程中，应该不断监视Terminate的值，一旦发现为True，则退出，例如在Execute()过程中可以这样写：</p>
<p>While not Terminate do<br />
begin<br />
........<br />
end;</p>
<p>3)退出的API 函数：</p>
<p>关于线程退出的API 函数声明如下：code</p>
<p>Function TerminateThread(hThread:Thandle;dwExitCode:DWORD);</p>
<p>不过，这个函数会使代码立刻终止，而不管程序中有没有</p>
<p>try....finally</p>
<p>机制，可能会导致错误，不到万不得已，最好不要使用。</p>
<p>4) 利用挂起线程的方法（suspend）</p>
<p>利用挂起线程的suspend方法，后面跟个Free，也可以释放线程，<br />
例如：</p>
<p>thread1.suspend; //挂起<br />
thread2.free; //释放</p>
<p>书上有相应的例子。</p>
<p>五、线程的优先级：</p>
<p>在多线程的情况下，一般要根据线程执行任务的重要性，给线程适当的优先级，一般如果量的线程同时申请CPU 时间，优先级高的线程优先。</p>
<p>在Windows下，给线程的优先级分为30级，而Delphi中Tthread 对象相对简单的把优先级分为七级。也就是在Tthread中声明了一个枚举类型TTthreadPriority:</p>
<p>type</p>
<p>TTthreadPriority(tpidle,tpLowest,tpLower,tpNormal,<br />
tpHight,tpHighest,tpTimecrital)</p>
<p>分别对应的是最低（系统空闲时有效，-15），较低（-2），低（-1），正常（普通0），高（1），较高（2），最高（15）。</p>
<p>其中tpidle和tpTimecrital有些特殊，具体情况请阅读书上有关内容。</p>
<p>设置优先级可使用thread对象的priority属性：</p>
<p>threadObject.priority:=Tthreadpriority(级别);</p>
<p>这里给出了一个演示多线程优先级的实例：</p>
<p>1-3 在数据库中使用多线程</p>
<p>一）使用ADO模式</p>
<p>由于Delphi 6.0的ADO 数据源控件内置了多线程能力，所以，在ADO模式下，使用多线程不需要做更多的工作。用两个ADOTable控件，分别连到两个数据库，并且分别通过DataSource控件，与数据帮定控件联系就可以了，这样就可以实现前后台处理数据库问题。</p>
<p>二）使用BDE模式和Tseeion对象</p>
<p>如果需要使用BDE 模式，那么多线程使用数据库，就要考虑Session的问题。在单线程时，每个数据源的建立就自动生成一个Session，这是这个数据源私有的关于数据库信息的文件。但多线程时，必须统一管理，所以在BDE 中专门提供了一个Tsession对象，它可以同时管理不同的Databas数据源对象。<br />
Databas数据源可以接受来自不同数据平台的数据库。</p>
<p>数据库1---databas(2)----table(Qurey)(3)---datasource<br />
| |<br />
| |<br />
|--------- Tsession(1)<br />
| |<br />
| |<br />
数据库2---databas(2)----table(Qurey)(3)---datasource</p>
<p>方法：<br />
1）Tsession<br />
属性：SessionName=名（自起）<br />
Active=true （激活）<br />
2）Database（可以有多个）<br />
属性：SessionName=Tsession名<br />
Dataname=名（自起，作为Table的标识）<br />
AliasName=数据库别名<br />
Connected=True （激活）<br />
3）Table或Qurey<br />
属性：SessionName=Tsession名（不要用默认值）<br />
DatabaseName=如果前面起了名，这里就会出现Database<br />
的名字。<br />
Tablename=表名<br />
Active=true （激活）<br />
以后比如加入Datasoucre和其他一样，这样就可以构造两个前后台处理的数据库管理系统了。</p>
<p>2-4 多线程的同步机制</p>
<p>同步机制，实际上是事件驱动机制，意思是让线程平时处于“休眠”状态，除非发生某个事件才触发。<br />
例如一个拷贝文件，拷贝线程完成一个程序块后，再唤醒进程条线程做一个格的填充。<br />
研究多线程的同步机制的必要性在于，多线程同步工作时，如果同时调用相同的资源，就可能会出现问题，一般读出是不会有问题的，但是，如果写入（全局变量、数据库），就会发生冲突，甚至产生死<br />
锁和竞争问题。</p>
<p>一、使用Synchronize方法</p>
<p>这个方法用于访问VCL 主线程所管理的资源，其方法的应用是：<br />
第一步：把访问主窗口（或主窗口控件资源）的代码放到线程的一个方法中；<br />
第二步：是在线程对象的Execute方法中，通过Synchronize方法使用该方法。<br />
实例：<br />
procedure Theater.Execute;<br />
begin<br />
Synchronize(update);<br />
end;</p>
<p>procedure Theater.update;<br />
begin<br />
.........<br />
end;</p>
<p>这里通过 Synchronize使线程方法update同步。</p>
<p>二、使用VCL类的Look方法</p>
<p>在Delphi的IDE提供的构件中，有一些对象内部提供了线程的同步机制，工作线程可以直接使用这些控件，比如：Tfont，Tpen，TBitmap，TMetafile，Ticon等。另外，一个很重要的控件对象叫TCanvas，提供了一个Lock方法用于线程的同步，当一个线程使用此控件对象的时候，首先调用这个对象的Lock方法，然后对这个控件进行操作，完毕后再调用Unlock方法，释放对控间的控制权。<br />
例如：<br />
CanversObject.look;<br />
try<br />
画图<br />
finally<br />
CanversObject.unlock;<br />
end;<br />
{使用这个保护机制,保证不论有没有异常，unlock都会被执行否则很可能会发生死锁。在多线程设计的时候，应该很注意发生死锁的问题}</p>
<p>三、Waitfor方法<br />
当一个线程应该等待另一个线程结束时，可以调用Waitfor方法。这个方法属于等待线程对象，Waitfor方法的原型如下:</p>
<p>Function Waitfor(Const Astring:string):string;</p>
<p>比如在前面最基本的线程的例子中，唤醒线程的语句中加上</p>
<p>thread1.resume;<br />
thread1.waitfor;<br />
thread2.resume;</p>
<p>那么所有的线程都必须等待thread1运行完毕后才能运行，其中包括主线程，可以预想，由于thread1调用了主窗体的Edit控件，那么，在thread1运行中间，Edie1也不会显示。<br />
这就告诉我们，这样的代码是不能作为主线程的一部分的，如果与主窗体连接的线程内等待另一个线程结束，而另一个线程又要等待访问用户界面，就可能是程序陷于死锁。<br />
这点在应用的时候要谨慎。</p>
<p>四、利用Windows的API 实现同步</p>
<p>Windows API函数提供了很多同步技术，下面简要介绍。</p>
<p>1）临界区</p>
<p>使用线程的时候，遇到的一个基本的问题，就是多个线程访问同一个对象，比如访问相同的文件、DLL、相同的通讯资源，特别是数据库的访问，当多个线程对同一数据库字段写入的时候，其结果会出<br />
现不确定性。<br />
临界区用于解决这个问题，它可以保证线程使用敏感数据的时候，阻赛其他的线程访问名干数据，使用时首先要初始化，其声明一个TRTLCriticalSection类型的变量：</p>
<p>var<br />
CS:TRTLCriticalSection;</p>
<p>初始化：</p>
<p>initializeCriticalSection(cs);</p>
<p>独占</p>
<p>EnterCriticalSection(cs);</p>
<p>解除独占</p>
<p>LeaveCriticalSection(CS);</p>
<p>使用临界区是比较方便而且概念比较清晰的的线程同步机制，应用比较广泛。<br />
请注意，临界区只能在一个进程内使用，首先要标记出把数据作为临界区操作的那些代码，在这部分代码执行前，计算机首先要查看一下全局记录，已确定是否有其它线程在临界区中，同时也要查看这个临界区是否和第一个临界区相关，也就是说同一个程序中可能会有几个不同的临界区，然后计算机再决定运行策略。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/13/delphi-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>八款开源 Android 游戏引擎 (巨好的资源)</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:30:42 +0000</pubDate>
		<dc:creator>iamsheldon</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/</guid>
		<description><![CDATA[初学Android游戏开发的朋友，往往会显得有些无所适从，他们常常不知道该从何处入手，每当遇到自己无法解决的难题时，又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用，一边自暴自弃的抱怨Android平台游戏开发难度太高，又连个像样的游 戏引擎也没有，甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。 事实上，这种想法完全是没有必要且不符合实际的，作为能和苹果iOS分庭抗礼的Android（各种意义上），当然也会有相当数量的游戏引擎存在。仅仅因为我们处于这个狭小的天地间，与外界接触不够，所以对它们的存在茫然不知罢了。 下面我就罗列出八款常见的Android游戏引擎，以供有需要者参考（收费，下载量过小，不公布源码，以及鄙人不知道（-_-）的引擎不在此列）。 1、Angle Angle是一款专为Android平台设计的，敏捷且适合快速开发的2D游戏引擎，基于OpenGL ES技术开发。该引擎全部用Java代码编写，并且可以根据自己的需要替换里面的实现，缺陷在于文档不足，而且下载的代码中仅仅包含有少量的示例教程。 最低运行环境要求不详。 项目地址：http://code.google.com/p/angle/ 2、Rokon rokon是一款Android 2D游戏引擎，基于OpenGL ES技术开发，物理引擎为Box2D，因此能够实现一些较为复杂的物理效果，该项目最新版本为 2.0.3 (09/07/10)。总体来说，此引擎最大的优点在于其开发文档相当之完备，并且项目作者对反馈Bug的修正非常之神速，所以该框架的使用在目前也最为 广泛，有人干脆将它称为Cocos2d-iPhone引擎的Android版（业务逻辑和编码风格上也确实很像）。附带一提，国内某个需要注册会员才能下 载的Android游戏框架衍生于此框架，所以大家也不要刻板的认为收费便一定是好的，免费就一定不好。 最低运行环境要求为Android 1.5。 项目地址：http://code.google.com/p/rokon/ 3、LGame LGame是一款国人开发的Java游戏引擎，有Android及PC(J2SE)两个开发版本，目前最高版本同为0.2.6(31/07/10)。其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API（PC版采用Graphics2D封装，Android版采用Canvas模拟实现），所以能够将J2SE或J2ME开发经验直接套用其中，两版本 间主要代码能够相互移植。Android版内置有Admob接口，可以不必配置XML直接硬编码Admob广告信息。 该引擎除了基本的音效、图形、物理、精灵等常用组件以外，也内置有Ioc、xml、http等常用Java组件的封装，代价是jar体积较为庞大，PC版 已突破1.2MB，Android版有所简化也在500KB左右。此外，该引擎还内置有按照1:1实现的J2ME精灵类及相关组件，可以将绝大多数 J2ME游戏平移到Android或PC版中。唯一遗憾的是，该项目作者是个极其懒惰的家伙，开发文档从去年说到今年依旧没有提供，只有游戏示例可供下 载。 最低运行环境要求为Android 1.1。 项目地址：http://code.google.com/p/loon-simple/ 4、AndEngine andengine同样是一款基于OpenGL ES技术的Android游戏引擎，物理引擎同样为Box2D（标配&#124;&#124;&#124;）。该框架性能普通，文档缺乏，但示例较为丰富。 下载地址（未直接提供jar下载，源码可通过svn提取）：http://code.google.com/p/andengine/ 最低运行环境要求不详。 项目地址：http://code.google.com/p/rokon/ 5、libgdx libgdx是一款基于OpenGL ES技术开发的Android游戏引擎，支持Android平台下的2D游戏开发，物理引擎采用Box2D实现。单就性能角度来说，堪称是一款非常强大的 Android游戏引擎，但缺陷在于精灵类等相关组件在使用上不够简化，而且文档也较为匮乏。 最低运行环境要求不详。 项目地址：http://code.google.com/p/libgdx/ 6、jPCT jPCT是一款基于OpenGL技术开发的3D图形引擎(PC环境为标准OpenGL，Android为OpenGL ES)， 以Java语言为基础的，拥有功能强大的Java 3D解决方案。该引擎与LGame（此为2D游戏引擎）相类似，目前拥有PC(J2SE)以及Android两个开发版本。 jPCT的最大优势之一，就在于它惊人的向下兼容性。在PC环境中，jPCT甚至可以运行在JVM1.1环境之中，因为jPCT内部提供的图形渲染接口完 全符合所有的Java 1.1规范（就连已经消失的Microsoft VM乃至更古老的Netscape 4 [...]]]></description>
			<content:encoded><![CDATA[<p>初学Android游戏开发的朋友，往往会显得有些无所适从，他们常常不知道该从何处入手，每当遇到自己无法解决的难题时，又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用，一边自暴自弃的抱怨Android平台游戏开发难度太高，又连个像样的游 戏引擎也没有，甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。</p>
<p>事实上，这种想法完全是没有必要且不符合实际的，作为能和苹果iOS分庭抗礼的Android（各种意义上），当然也会有相当数量的游戏引擎存在。仅仅因为我们处于这个狭小的天地间，与外界接触不够，所以对它们的存在茫然不知罢了。</p>
<p>下面我就罗列出八款常见的Android游戏引擎，以供有需要者参考（收费，下载量过小，不公布源码，以及鄙人不知道（-_-）的引擎不在此列）。<br />
1、Angle</p>
<p>Angle是一款专为Android平台设计的，敏捷且适合快速开发的2D游戏引擎，基于OpenGL ES技术开发。该引擎全部用Java代码编写，并且可以根据自己的需要替换里面的实现，缺陷在于文档不足，而且下载的代码中仅仅包含有少量的示例教程。</p>
<p>最低运行环境要求不详。</p>
<p>项目地址：<a href="http://code.google.com/p/angle/">http://code.google.com/p/angle/ </a><br />
2、Rokon</p>
<p>rokon是一款Android 2D游戏引擎，基于OpenGL ES技术开发，物理引擎为Box2D，因此能够实现一些较为复杂的物理效果，该项目最新版本为 2.0.3 (09/07/10)。总体来说，此引擎最大的优点在于其开发文档相当之完备，并且项目作者对反馈Bug的修正非常之神速，所以该框架的使用在目前也最为 广泛，有人干脆将它称为Cocos2d-iPhone引擎的Android版（业务逻辑和编码风格上也确实很像）。附带一提，国内某个需要注册会员才能下 载的Android游戏框架衍生于此框架，所以大家也不要刻板的认为收费便一定是好的，免费就一定不好。</p>
<p>最低运行环境要求为Android 1.5。</p>
<p>项目地址：<a href="http://code.google.com/p/rokon/">http://code.google.com/p/rokon/</a></p>
<p>3、LGame</p>
<p>LGame是一款国人开发的Java游戏引擎，有Android及PC(J2SE)两个开发版本，目前最高版本同为0.2.6(31/07/10)。其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API（PC版采用Graphics2D封装，Android版采用Canvas模拟实现），所以能够将J2SE或J2ME开发经验直接套用其中，两版本 间主要代码能够相互移植。Android版内置有Admob接口，可以不必配置XML直接硬编码Admob广告信息。</p>
<p>该引擎除了基本的音效、图形、物理、精灵等常用组件以外，也内置有Ioc、xml、http等常用Java组件的封装，代价是jar体积较为庞大，PC版 已突破1.2MB，Android版有所简化也在500KB左右。此外，该引擎还内置有按照1:1实现的J2ME精灵类及相关组件，可以将绝大多数 J2ME游戏平移到Android或PC版中。唯一遗憾的是，该项目作者是个极其懒惰的家伙，开发文档从去年说到今年依旧没有提供，只有游戏示例可供下 载。</p>
<p>最低运行环境要求为Android 1.1。</p>
<p>项目地址：<a href="http://code.google.com/p/loon-simple/">http://code.google.com/p/loon-simple/</a></p>
<p>4、AndEngine</p>
<p>andengine同样是一款基于OpenGL ES技术的Android游戏引擎，物理引擎同样为Box2D（标配|||）。该框架性能普通，文档缺乏，但示例较为丰富。</p>
<p>下载地址（未直接提供jar下载，源码可通过svn提取）：http://code.google.com/p/andengine/</p>
<p>最低运行环境要求不详。</p>
<p>项目地址：<a href="http://code.google.com/p/rokon/">http://code.google.com/p/rokon/ </a><br />
5、libgdx</p>
<p>libgdx是一款基于OpenGL ES技术开发的Android游戏引擎，支持Android平台下的2D游戏开发，物理引擎采用Box2D实现。单就性能角度来说，堪称是一款非常强大的 Android游戏引擎，但缺陷在于精灵类等相关组件在使用上不够简化，而且文档也较为匮乏。</p>
<p>最低运行环境要求不详。</p>
<p>项目地址：<a href="http://code.google.com/p/libgdx/">http://code.google.com/p/libgdx/ </a><br />
6、jPCT</p>
<p>jPCT是一款基于OpenGL技术开发的3D图形引擎(PC环境为标准OpenGL，Android为OpenGL ES)， 以Java语言为基础的，拥有功能强大的Java 3D解决方案。该引擎与LGame（此为2D游戏引擎）相类似，目前拥有PC(J2SE)以及Android两个开发版本。</p>
<p>jPCT的最大优势之一，就在于它惊人的向下兼容性。在PC环境中，jPCT甚至可以运行在JVM1.1环境之中，因为jPCT内部提供的图形渲染接口完 全符合所有的Java 1.1规范（就连已经消失的Microsoft VM乃至更古老的Netscape 4 VM也不例外）。</p>
<p>最低运行环境要求为Android 1.5。</p>
<p>项目地址：<a href="http://www.jpct.net/jpct-ae/">http://www.jpct.net/jpct-ae/ </a><br />
7、Alien3d</p>
<p>Alien3d是一款体积非常之小的Android 3D游戏引擎，基于OpenGL ES技术开发。为了压缩体积，它根据不同功能采用多jar方式发布（包括alien3d-engine.jar，alien3d- tiled.jar，alien3d-sprites.jar，alien3d-shapes.jar，alien3d- particles2d.jar，），事实上它的核心文件大约只有40KB，所有相关jar的总和也不足150KB。</p>
<p>最低运行环境要求为Android 1.5。</p>
<p>项目地址：<a href="http://code.google.com/p/alien3d/">http://code.google.com/p/alien3d/ </a><br />
8、Catcake</p>
<p>Catcake是一款跨平台的Java 3D图形引擎，目前支持PC(J2SE)及Android环境运行（已有iPhone版规划）。该引擎在易用性和运行性能上皆有出色的表现，支持常见的游戏开发功能，诸如精灵动画，音频处理和视频播放等。</p>
<p>最低运行环境要求为Android 1.6。</p>
<p>项目地址：<a href="http://code.google.com/p/catcake/">http://code.google.com/p/catcake/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/13/android-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用Windows API 多线程编程解决“哲学家进餐问题”</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/13/windows-api/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/13/windows-api/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:28:59 +0000</pubDate>
		<dc:creator>wgj200123</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/13/windows-api/</guid>
		<description><![CDATA[哲学家进餐问题描述： 有五个哲学家，他们的生活方式是交替地进行思考和进餐。哲学家们公用一张圆桌，周围放有五把椅子，每人坐一把。在圆桌上有五个碗和五根筷子，当一个哲学家思考时，他不与其他人交谈，饥饿时便试图取用其左、右最靠近他的筷子，但他可能一根都拿不到。只有在他拿到两根筷子时，方能进餐，进餐完后，放下筷子又继续思考。 01.#include 02.#include 03. 04.#define P(S) WaitForSingleObject(S, INFINITE) //P操作 05.#define V(S) ReleaseSemaphore(S, 1, NULL) 06.#define NUMBERS 5 //叉子个数 07.typedef HANDLE Semaphore; //信号量原型 08.Semaphore chopstick[5]; 09.Semaphore mutex; //定义一个互斥量 10.Semaphore room; 11.char *philosophers[5] = {"哲学家1 ", "哲学家2 ", "哲学家3 ", "哲学家4 ", "哲学家5 "}; 12.char *str[] = {"得到左手边的筷子", "得到右手边的筷子", "得到一双筷子，开始吃饭!", "饭吃完了，该开始思考问题了"}; 13. 14.DWORD WINAPI philosopher(LPVOID lParam); [...]]]></description>
			<content:encoded><![CDATA[<p>哲学家进餐问题描述：</p>
<p>有五个哲学家，他们的生活方式是交替地进行思考和进餐。哲学家们公用一张圆桌，周围放有五把椅子，每人坐一把。在圆桌上有五个碗和五根筷子，当一个哲学家思考时，他不与其他人交谈，饥饿时便试图取用其左、右最靠近他的筷子，但他可能一根都拿不到。只有在他拿到两根筷子时，方能进餐，进餐完后，放下筷子又继续思考。</p>
<p>01.#include<br />
02.#include<br />
03.<br />
04.#define P(S) WaitForSingleObject(S, INFINITE) //P操作<br />
05.#define V(S) ReleaseSemaphore(S, 1, NULL)<br />
06.#define NUMBERS 5 //叉子个数<br />
07.typedef HANDLE Semaphore; //信号量原型<br />
08.Semaphore chopstick[5];<br />
09.Semaphore mutex; //定义一个互斥量<br />
10.Semaphore room;<br />
11.char *philosophers[5] = {"哲学家1 ", "哲学家2 ", "哲学家3 ", "哲学家4 ", "哲学家5 "};<br />
12.char *str[] = {"得到左手边的筷子", "得到右手边的筷子", "得到一双筷子，开始吃饭!", "饭吃完了，该开始思考问题了"};<br />
13.<br />
14.DWORD WINAPI philosopher(LPVOID lParam); //线程函数声明<br />
15.void main()<br />
16.{<br />
17. HANDLE hThread[NUMBERS]; //线程句柄<br />
18. DWORD ThreadID[NUMBERS]; //线程ID<br />
19.<br />
20. //初始化信号量<br />
21. mutex = CreateSemaphore(NULL, 1, 1, "mutex");<br />
22. if(!mutex)<br />
23. cout&lt;&lt;"创建信号量失败"&lt;&lt;endl;<br />
24. for (int i=0; i&lt;5; i++)<br />
25. {<br />
26. chopstick[i] = CreateSemaphore(NULL, 1, 1, NULL);<br />
27. if(!chopstick[i])<br />
28. cout&lt;&lt;"创建信号量失败"&lt;&lt;endl;<br />
29. }<br />
30. for (i=0; i&lt;NUMBERS; i++)<br />
31. {<br />
32. hThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)philosopher, (LPVOID *)&amp;i, 0, &amp;ThreadID[i]);<br />
33. if (!hThread[i])<br />
34. {<br />
35. cout&lt;&lt;"创建线程失败"&lt;&lt;endl;<br />
36. }<br />
37. WaitForSingleObject(hThread[i], 5000);<br />
38. }<br />
39.}<br />
40.<br />
41.DWORD WINAPI philosopher(LPVOID lParam)<br />
42.{<br />
43. int i = *(int *)lParam;<br />
44. while (true)<br />
45. {<br />
46. P(mutex);<br />
47. P(chopstick[i]);<br />
48. cout&lt;&lt;philosophers[i]&lt;&lt;str[0]&lt;&lt;endl;<br />
49. P(chopstick[(i+1)%5]);<br />
50. cout&lt;&lt;philosophers[i]&lt;&lt;str[1]&lt;&lt;endl;<br />
51. cout&lt;&lt;philosophers[i]&lt;&lt;str[2]&lt;&lt;endl;<br />
52. V(chopstick[i]);<br />
53. V(chopstick[(i+1)%5]);<br />
54. cout&lt;&lt;philosophers[i]&lt;&lt;str[3]&lt;&lt;endl&lt;&lt;endl;<br />
55. Sleep(1000); //整个吃饭过程大约一秒时间<br />
56. V(mutex);<br />
57. }<br />
58. return 0;<br />
59.}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/13/windows-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（二）——新版本模块结构</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:58:58 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/</guid>
		<description><![CDATA[还是老话题，2.0版本对OpenCV可是进行了大刀阔斧的改革，用c++重新了大部分结构，而不是1.X版本中的c结构。这些模块包括： core——定义了基本数据结构，包括最重要的Mat和一些其他的模块 imgproc——该模块包括了线性和非线性的图像滤波，图像的几何变换，颜色空间转换，直方图处理等等 video——该模块包括运动估计，背景分离，对象跟踪 calib3d——基本的多视角几何算法，单个立体摄像头标定，物体姿态估计，立体相似性算法，3D信息的重建 features2d——显著特征检测，描述，特征匹配 objdetect——物体检测和预定义好的分类器实例（比如人脸，眼睛，面部，人，车辆等等） highgui——视频捕捉、图像和视频的编码解码、图形交互界面的接口 gpu——利用GPU对OpenCV模块进行加速算法 ml——机器学习模块（SVM，决策树，Boosting等等） flann——Fast Library for Approximate Nearest Neighbors（FLANN）算法库 legacy——一些已经废弃的代码库，保留下来作为向下兼容 还有一些其他的模块，比如FLANN算法库、Google测试包、Python bingdings等等。]]></description>
			<content:encoded><![CDATA[<p>还是老话题，2.0版本对OpenCV可是进行了大刀阔斧的改革，用c++重新了大部分结构，而不是1.X版本中的c结构。这些模块包括：</p>
<p>core——定义了基本数据结构，包括最重要的Mat和一些其他的模块</p>
<p>imgproc——该模块包括了线性和非线性的图像滤波，图像的几何变换，颜色空间转换，直方图处理等等</p>
<p>video——该模块包括运动估计，背景分离，对象跟踪</p>
<p>calib3d——基本的多视角几何算法，单个立体摄像头标定，物体姿态估计，立体相似性算法，3D信息的重建</p>
<p>features2d——显著特征检测，描述，特征匹配</p>
<p>objdetect——物体检测和预定义好的分类器实例（比如人脸，眼睛，面部，人，车辆等等）</p>
<p>highgui——视频捕捉、图像和视频的编码解码、图形交互界面的接口</p>
<p>gpu——利用GPU对OpenCV模块进行加速算法</p>
<p>ml——机器学习模块（SVM，决策树，Boosting等等）</p>
<p>flann——Fast Library for Approximate Nearest Neighbors（FLANN）算法库</p>
<p>legacy——一些已经废弃的代码库，保留下来作为向下兼容</p>
<p>还有一些其他的模块，比如FLANN算法库、Google测试包、Python bingdings等等。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（一）——安装配置、第一个程序</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:58:05 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/</guid>
		<description><![CDATA[决心开始研究OpenCV。闲言少叙，sourceforge网站最近的版本是2011年8月的OpenCV2.3.1，下载安装，我这里使用的开发环境是vs2008，网上搜了一下配置的教程，与之前的几个OpenCV版本的配置过程大体相同：（教程网上很多，知之为知之，不知百度之，我这里粗略再讲一下） 1. 配置电脑的环境变量（Path变量）（需要注销才能生效），这里需要注意网上的教程又让增加一个OPENCV变量，值为D:\Program Files\OpenCV2.3.1\build(你安装的路径中的build目录) 2. 添加包含文件和库文件，这个和前几个版本方法类似，都是去工具-&#62;选项-&#62;VC目录添加build目录下的include目录及其子目录和你电脑对应版本的lib目录（选择x86 or x64，vc9 or vc10） 下面是第一个实例： 新建一个空项目，添加源文件如下： #include #include #include using namespace cv; using namespace std; int main( int argc, char** argv ) { if( argc != 2) { cout &#60;&#60;&#34; Usage: display_image ImageToLoadAndDisplay&#34; &#60;&#60; endl; return -1; } Mat image; image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // Read the file if(! [...]]]></description>
			<content:encoded><![CDATA[<p>决心开始研究OpenCV。闲言少叙，sourceforge网站最近的版本是2011年8月的OpenCV2.3.1，下载安装，我这里使用的开发环境是vs2008，网上搜了一下配置的教程，与之前的几个OpenCV版本的配置过程大体相同：（教程网上很多，知之为知之，不知百度之，我这里粗略再讲一下）</p>
<p>1. 配置电脑的环境变量（Path变量）（需要注销才能生效），这里需要注意网上的教程又让增加一个OPENCV变量，值为D:\Program Files\OpenCV2.3.1\build(你安装的路径中的build目录)</p>
<p>2. 添加包含文件和库文件，这个和前几个版本方法类似，都是去工具-&gt;选项-&gt;VC目录添加build目录下的include目录及其子目录和你电脑对应版本的lib目录（选择x86 or x64，vc9  or vc10）</p>
<p>下面是第一个实例：</p>
<p>新建一个空项目，添加源文件如下：<br />
<code>#include<br />
#include<br />
#include </p>
<p>using namespace cv;<br />
using namespace std; </p>
<p>int main( int argc, char** argv )<br />
{<br />
	if( argc != 2)<br />
	{<br />
	 cout &lt;&lt;&quot; Usage: display_image ImageToLoadAndDisplay&quot; &lt;&lt; endl;<br />
	 return -1;<br />
	}</p>
<p>	Mat image;<br />
	image = imread(argv[1], CV_LOAD_IMAGE_COLOR);	// Read the file</p>
<p>	if(! image.data )                              // Check for invalid input<br />
	{<br />
		cout &lt;&lt;  &quot;Could not open or find the image&quot; &lt;&lt; std::endl ;<br />
		return -1;<br />
	}</p>
<p>	namedWindow( &quot;Display window&quot;, CV_WINDOW_AUTOSIZE );// Create a window for display.<br />
	imshow( &quot;Display window&quot;, image );                   // Show our image inside it.</p>
<p>	waitKey(0);											 // Wait for a keystroke in the window<br />
	return 0;<br />
}</code><br />
这段程序可以在你安装目录下的samples\cpp\tutorial_code\introduction\display_image找到，编译后，将图片test.jpg放到opencvtest.exe相同的目录中去，利用cmd命令行进入的可执行文件所在的目录，<br />
运行opencvtest test.jpg</p>
<p>则会显示一个图片，第一个程序成功。如图</p>
<p>如果遇到找不到tbb_debug.dll文件的问题，参考这里<a href="http://www.opencv.org.cn/forum/viewtopic.php?p=52223">http://www.opencv.org.cn/forum/viewtopic.php?p=52223</a>，只是我的环境是vs2008，大同小异。祝你成功！</p>
<p>接下来我觉得应该好好研究一下OpenCV里的doc文件夹下的教程和使用手册，我个人觉得《学习OpenCV》这本书已经远远跟不上OpenCV发展的速度了</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5之Web Storage</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 04:00:27 +0000</pubDate>
		<dc:creator>章政</dc:creator>
				<category><![CDATA[Android 开发]]></category>
		<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[全国博客大奖赛]]></category>
		<category><![CDATA[全国大学生软件创新大赛专栏]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[移动技术]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[英特尔信息技术峰会]]></category>
		<category><![CDATA[虚拟化技术]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/</guid>
		<description><![CDATA[WebStorage的出现是为了弥补cookie的不足,cookie一方面是容量小，4k/8k，存几个电子邮件都不够，二来是全局的，容易被误用，盗用。 在HTML5中网络存储按照生命周期分为2种，一种是基于会话(session),这种存储周期只是当前会话，当网页[注1]被关被后，或者被转到其他网站后，存储也就被销毁； sessionStorage.varName = “生成新变量”; sessionStorage.varName = “变量操作”; delete sessionStorage.varName; //删除变量 另外一种是本地存储，当网页下次被打开的时候，你仍然可以访问上次打开该网页时存储的数据，比如本地存储的网站用户名就可以使用这种方式。 用法和基于会话的存储一样，只是前缀名改成了localStorage localStorage.varName = “生成新变量”; localStorage.varName = “变量操作”; delete localStorage.varName; //删除变量 从上面可以看出web storage其实也只是解决了轻量级的数据存储问题，如果是大量的数据查询，比如商品列表，还是得靠数据库,HTML5中有Web Database来支持这一操作，基本操作和SQL一致。 注1：现在的浏览器基本都支持多窗口了，一个窗口对应一个网页 注2：官方参考]]></description>
			<content:encoded><![CDATA[<p>WebStorage的出现是为了弥补cookie的不足,cookie一方面是容量小，4k/8k，存几个电子邮件都不够，二来是全局的，容易被误用，盗用。<br />
在HTML5中网络存储按照生命周期分为2种，一种是基于会话(session),这种存储周期只是当前会话，当网页[注1]被关被后，或者被转到其他网站后，存储也就被销毁；</p>
<pre name="code" class="js">
sessionStorage.varName = “生成新变量”;
sessionStorage.varName = “变量操作”;
delete sessionStorage.varName;  //删除变量
</pre>
<p>另外一种是本地存储，当网页下次被打开的时候，你仍然可以访问上次打开该网页时存储的数据，比如本地存储的网站用户名就可以使用这种方式。<br />
用法和基于会话的存储一样，只是前缀名改成了localStorage</p>
<pre name="code" class="js">
localStorage.varName = “生成新变量”;
localStorage.varName = “变量操作”;
delete localStorage.varName;  //删除变量
</pre>
<p>从上面可以看出web storage其实也只是解决了轻量级的数据存储问题，如果是大量的数据查询，比如商品列表，还是得靠数据库,HTML5中有Web Database来支持这一操作，基本操作和SQL一致。<br />
注1：现在的浏览器基本都支持多窗口了，一个窗口对应一个网页<br />
注2：<a href="http://dev.w3.org/html5/webstorage/">官方参考</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/26/html5web-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

