zoukankan      html  css  js  c++  java
  • WorldWind学习系列二:擒贼先擒王篇2

      4.解析Main(string[] args)中参数args。主要是在控制台中启动程序时同时赋予了参数的形式。

       // ParseArgs may set values that are used elsewhere,
       
     // such as startFullScreen and CurrentSettingsDirectory.
        ParseArgs(args);

          args中参数可能是:

          "worldwind://":加载定位显示球体某处。

          “/f” :全屏启动。

           “/s=……”:指定加载配置的文件夹路径。

           这里要注意的事,Main函数一般是没有参数的,如果我们以后要写可以在控制台下给启动程序传入参数,可以借鉴一下。

      5.加载上次使用的配置信息,包括上次使用的WorldWind主窗体使用信息和上次使用的World球体显示信息

    加载配置
    if(CurrentSettingsDirectory == null)
    {
    // load program settings from default directory
    LoadSettings();
    World.LoadSettings();
    }
    else
    {
    LoadSettings(CurrentSettingsDirectory);
    World.LoadSettings(CurrentSettingsDirectory);
    }

    这里有几个知识点可以学习一下:

    (1)C#对象的序列化为XML文件和反序列化Xml文件为对象,参看:http://www.cnblogs.com/wuhenke/archive/2009/12/10/1621437.html

    SettingsBase类的 Load方法中的反序列化:

    XmlSerializer ser = new XmlSerializer(defaultSettings.GetType());

    using(TextReader tr = new StreamReader(fileName)) 
    {
    settings 
    = (SettingsBase)ser.Deserialize(tr);
    settings.m_fileName 
    = fileName; // remember where we loaded from for a later save
    }

     (2)C#中的StreamWriter类的学习使用

    Log类主要用于输出Error Bug Warning等输出记录。主WorldWind.log是保存所有的记录,然后对Debug信息单独输出单个的.log文件。

    logWriter负责写WorldWind.log
    logPath = DefaultSettingsDirectory();
    Directory.CreateDirectory(logPath);

    // TODO: do not hardcode logfile name?
    logFilePath = Path.Combine( logPath, "WorldWind.log" );

    logWriter 
    = new StreamWriter(logFilePath, true);
    logWriter.AutoFlush 
    = true;

    public static void Write( Exception caught )负责写单独每个Error的输出。

    单个Log文件输出
    string functionName = "Unknown";
     
    string[] stacktrace = null;
    if (caught.StackTrace != null)
     {
     stacktrace 
    = caught.StackTrace.Split('\n');
     
    string firstStackTraceLine = stacktrace[0];
      functionName 
    = firstStackTraceLine.Trim().Split(" (".ToCharArray())[1];
      }
     
    string logFileName = string.Format("DEBUG_{0}.txt", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff"));  //以DEBUG+日期作为文件名
     
    string logFullPath = Path.Combine(logPath, logFileName);
     
    using (StreamWriter sw = new StreamWriter(logFullPath, false))
     {
        sw.WriteLine(caught.ToString());
      }

     

      6.启动主程序,还有对线程异常事件处理和程序空闲处理(防止过度休眠)

    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

    MainApplication app 
    = new MainApplication();
    Application.Idle 
    += new EventHandler(app.WorldWindow.OnApplicationIdle);
    Application.Run(app);

      7.程序启动后,将状态配置保存起来

        // Save World settings
        World.Settings.Save();

         其中用到了,将World的配置对象WorldSettings(注意:不是其父类SettingsBase,只是调用其父类的Save方法)序列化为XML文件,并保存,以备下次启动前读取World(即球体)上次状态配置。

    将WorldSettings序列化
            public virtual void Save(string fileName) 
            {
                XmlSerializer ser 
    = null;

                
    try 
                {
                    ser 
    = new XmlSerializer(this.GetType());
                    
    using(TextWriter tw = new StreamWriter(fileName)) 
                    {
                        ser.Serialize(tw, 
    this);
                    }
                }
                
    catch(Exception ex) 
                {
                    
    throw new System.Exception(String.Format("Saving settings class '{0}' to {1} failed"this.GetType().ToString(), fileName), ex);
                }
            }

      8.保存程序整体的该次状态配置。(此处类似7,不详讲,只是这次序列化的对象是WorldWindSettings)

         // Save program settings
          Settings.Save();

     

      总结:主函数内容分析学习到此完成。我们之后会针对各功能分别分析,个个突破。

  • 相关阅读:
    深入了解 JavaScript 中的 for 循环
    JavaScript 字符串常用操作
    10个习惯助你成为一名优秀的程序员
    Ubuntu日常问题搜集和解决办法
    提升你的开发效率,10 个 NPM 使用技巧
    Redux教程3:添加倒计时
    Redux教程2:链接React
    Redux教程1:环境搭建,初写Redux
    React + Redux 入坑指南
    12个非常实用的JavaScript小技巧
  • 原文地址:https://www.cnblogs.com/wuhenke/p/1621421.html
Copyright © 2011-2022 走看看