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

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#8334
01  #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应用中计算复杂的一些工作交给本地进程来做,以获得更高的执行效率。请着重参考中间的进程调取部分(中文注释):

001  <? 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值