怎样用C#调用R软件:R(D)COM(二)

     在 http://cran.r-project.org/可以下载R软件,选择Other,下载R_Scilab_DCOM3.0-1B5.exe,就是R(D)COM。
      在安装了R(D)COM之后,假设安装目录为“D:\Program Files\(D)COM Server\bin“。在该目录下有RServerManager.exe,在VS2005中通过Add Reference->Browse,选择RServerManager.exe。添加以后,会增加RServerManager, ConnectorCommonLib,
STATCONNECTORSEVLib三个引用。可以通过VS2005的对象察看器看三个引用中的类和函数。
      每次创建一个StatConnectorClass对象时,都会启动一个服务,用于处理一个连接对象所提交的请求,这个资源不会自己停止,所以需要一个类似于连接池的服务管理器。在R(D)COM中提供了两个类ServerPool和ServerItem来完成服务管理的功能。下面的类封装了该操作。

using System;
using STATCONNECTORSRVLib;
using RServerManager;
using System.Threading;

namespace Common.Regression
{
    /**//// <summary>
    /// BaseRegression 回归抽象基类
    /// </summary>
    public abstract class BaseRegression : IRegression
    {
        private static ServerPool mServerPool = null;
        private ServerItem mServerItem = null;
        private IStatConnector mStatConnector = null;

        private static string mKey = "R";
        private static string mClient = "this is client";
        private static int mWaitTime = 50;
        private static int mMaxLoop = 20;
        private static int mMaxServerCount = 5;
        private static int mServerCount = 0;

        static BaseRegression()
        {
            if (mServerPool == null)
            {
                mServerPool = new ServerPool();
            }
        }

        private double[,] mData;
        public double[,] Data
        {
            get
            {
                return mData;
            }
            set
            {
                mData = value;
            }
        }

        private RegressionSummary mSummary;
        public RegressionSummary Summary
        {
            get
            {
                return mSummary;
            }
            set
            {
                mSummary = value;
            }
        }

        /**//// <summary>
        /// 执行回归函数
        /// </summary>
        public abstract void DoRegression();

        /**//// <summary>
        /// 得到执行R代码的连接
        /// </summary>
        /// <returns></returns>
        protected IStatConnector GetStatConnector()
       {
            mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
            int count = 0;
            while (mServerItem == null)
            {
                if (mServerCount < mMaxServerCount)
                {
                    //当小于最小服务器数目时,增加连接
                    mStatConnector = new StatConnectorClass();
                    mStatConnector.Init(mKey);
                    mServerPool.Add(mStatConnector, mKey);
                    mServerCount++;
                    mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
                    break;
                }
                if (count < mMaxLoop)
                {
                    Thread.Sleep(mWaitTime);
                    count++;
                    mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
                }
                else
                {
                    return null;
                }
            }

            mStatConnector = mServerItem.Server;
            return mStatConnector;
           
        }

        /**//// <summary>
        /// 释放锁定
        /// </summary>
        public void ReleaseLock()
        {
            if (mServerItem != null)
            {
                mServerItem.ReleaseLock();
            }
        }

        public BaseRegression()
        {           
        }
    }

}


从BaseRegression继承的类将拥有可以被管理。

using System;
using System.Configuration;
 
 
namespace Common.Regression
{
     /// <summary>
     /// IRegression 回归类接口
     /// </summary>
    public interface IRegression
    {
         double[,] Data
         {
             get;
             set;
         }
 
         RegressionSummary Summary
         {
             get;
         }
 
         void DoRegression();
 
         void ReleaseLock();
 
 
     }
 
 }

你可能感兴趣的:(thread,C++,c,C#,Excel)