您的位置:首页 > 大数据 > 人工智能

AIR2.0入门教程 与本地进程的数据通讯

2013-07-12 11:04 399 查看
http://www.korise.com/?p=132
在前两篇文章中,我们了解了AIR2.0Beta带来的新特性,以及AIR2.0中的拖拽增强,现在我们来看AIR2.0另一个非常有用的新特性:可以启动本地进程并与本地进程进行数据通讯。了解NativeProcess
在AIR2中,我们可以打包一个AIR应用为本地安装文件,比如在Windows下面是.exe,在Mac系统下是.dmg,这样我们的AIR应用就具备了运行一个本地进程并与之交互的能力。要实现这个功能,需要使用NativeProcess类。这是AIR2中出现的一个新的类。我们可以调用NativeProcess.isSupported,来判断我们的AIR应用是否支持运行本地进程,如果你的应用是以.air部署的,那么就会得到值为false。要运行本地进程,我们需要创建一个NativeProcess类的实例,并调用它的start 方法来启动一个进程,与这个类配合工作的还有NativeProcessStartupInfo类,我们也要创建这个类的实例,并指定可运行的exe文件(windows下)。在下面的例子中,我们还将讲解如何打包一个AIR应用为一个本地安装文件,并且了解如何使用标准的输入输出(STDIN和STDOUT)流来通讯。如果你已经具备了一些C++语言的编程知识,那理解这篇文章就更容易一些。本文涉及的源码下载:
AIR项目源码下载
准备和编译C++应用
在这个示例中,我们会创建一个C++的程序文件,你可以使用VS或其它你熟悉的工具来编译这个类文件为exe文件,这个文件的代码部分很简单,就是执行从m到n的累加,然后将计算的结果通过标准输入输出返回。如果你不能编译也不必担心,这个例子的源码中已经包含了编译后的exe文件。C++代码:C++语言: Codee#833401 #include <iostream>
02 using namespace std;
03 void main (void)
04 {
05 int a,b;
06 int c=100;
07 cin>>a>>b;
08 for(int i=a;i<b;i++)
09 {
10 c+=i;
11 }
12 cout<<c<<endl;
13 }将编译后的exe文件保存好,一会儿会用到。
创建AIR应用
使用Flex Builder创建一个AIR项目,注意选择SDK为包含AIR2 SDK的版本(在第一篇文章中有介绍),然后打开AIR的配置XML文件,添加下面的一行:extendedDesktop
这是必须的,否则你的AIR应用将无法执行本地进程。然后用下面的代码替换掉你的主文件的代码,代码中我们调取C++来计算一个从m到n的累加计算,并提供了用AS3计算的机制,来做对比。当然,结果没有悬念,C++轻松胜出,我们可以从中启发一些想法,比如将AIR应用中计算复杂的一些工作交给本地进程来做,以获得更高的执行效率。请着重参考中间的进程调取部分(中文注释):: Codee#8338001 <?xml version="1.0" encoding="utf-8"?>
002 <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init()"layout="absolute" width="356" height="347">
003 <mx:Script>
004 <![CDATA[
005 import flash.events.MouseEvent;
006 private var process:NativeProcess;
007 [Bindable]
008 private var resultData:String;
009 [Bindable]
010 private var cerData:String;
011
012 private var startDate:Date;
013 private var endDate:Date;
014
015 public function init():void
016 {
017 if (NativeProcess.isSupported)//判断是否支持调取本地进程
018 {
019 launchEchoTest();
020 }
021 else
022 {
023 resultData = "NativeProcess not supported.";
024 }
025 }
026 public function launchEchoTest():void//这个方法初始化的时候即执行,运行exe文件,等待输入参数
027 {
028 var file:File = File.applicationDirectory;//创建File对象
029 file = file.resolvePath("NativeApps/Windows/bin/TestCCC.exe");//指向你的exe文件
030
031 var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();//创建进程信息对象
032 nativeProcessStartupInfo.executable = file;//将file指定为可执行文件
033
034 process = new NativeProcess();//创建一个本地进程
035 process span>.start(nativeProcessStartupInfo);//运行本地进程
036 process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);//侦听进程的输出信息
037 process.addEventListener(ProgressEvent.STANDARD_INPUT_PROGRESS, inputProgressListener);//侦听进程的输入信息
038 }
039 public function writeData():void
040 {
041 process.standardInput.writeUTFBytes(num1.text + "\n");//C++方法中需要的两个输入,从这里写入
042 process.standardInput.writeUTFBytes(num2.text + "\n");
043 }
044 public function inputProgressListener(event:ProgressEvent):void
045 {
046 process.closeInput();//关闭输入
047 }
048 public function onOutputData(event:ProgressEvent):void
049 {
050 resultData = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);//获取进程返回的数据
051 endDate = new Date();
052 cerData = endDate.time - startDate.time + "";//计算时间差值
053 launchEchoTest();//再次启动进程,并等待输入
054 }
055
056 protected function button1_clickHandler(event:MouseEvent):void
057 {
058 startDate = new Date();
059 if(radiogroup1.selectedValue == 0) {
060 trace("use c++");
061 writeData();
062 } else {
063 trace("use as3");//使用AS3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: