private void LaunchSubProcess(Request request)
 {
     string args = String.Format(" \"{0}\" -i \"{1}\" -o \"{2}\" -rate {3} -replace \"{4}\" -delete \"{5}\" -utf8", 
         request.Voice, request.InputTextFile, request.OutputAudioFile, request.Rate, request.ReplacementFile, request.DeletionFile);
     Process p = new Process();
     p.StartInfo.FileName = Path.Combine("TTS", "TTS.exe");
     p.StartInfo.UseShellExecute = false;
     p.StartInfo.WorkingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
     p.StartInfo.Arguments = args;
     p.StartInfo.RedirectStandardOutput = true;
     p.StartInfo.CreateNoWindow = true;
     p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
     p.Start();
     StreamReader output = p.StandardOutput;
     string line;
     while ((line = output.ReadLine()) != null)
     {
         if (BackgroundService.Instance.ttsController.InvokeRequired)
         {
             BackgroundService.Instance.ttsController.BeginInvoke(new MethodInvoker(delegate
             {
                 int percent;
                 if(Int32.TryParse(line, out percent))
                 {
                     request.Progress = percent;
                 }
             }));
         }
     }
     p.WaitForExit();
 }
 public void AddRequest(Request request)
 {
     int i = 0;
     for (; i < _requestList.Count; i++)
     {
         if (request.Priority > _requestList[i].Priority && request.ID < _requestList[i].ID && _requestList[i].TakenBy == -1)
             break;
     }
     //request.Position = i;
     ManualResetEvent mre = new ManualResetEvent(false);
     lock (requestListLock)
     {
         if (BackgroundService.Instance.ttsController.InvokeRequired)
         {
             BackgroundService.Instance.ttsController.BeginInvoke(new MethodInvoker(delegate
             {
                 _requestList.Insert(i, request);
                 mre.Set();
             }));
         }
     }
     mre.WaitOne(-1);
     idleMRE.Set();
 }
 private void RemoveTop(Request request)
 {
     lock (requestListLock)
     {
         if (BackgroundService.Instance.ttsController.InvokeRequired)
         {
             BackgroundService.Instance.ttsController.BeginInvoke(new MethodInvoker(delegate
             {
                 _requestList.Remove(request);
             }));
         }
         
     }
 }
        /*============Private Function======*/

        private void Test(Object obj)
        {
            string novelTitle = (string)obj;
            Novel n = NovelLibrary.Instance.GetNovel(novelTitle);
            UpdateNovels();

            for (int i = 0; i < n.Chapters.Count; i++)
            {
                Chapter c = n.Chapters[i];
                Request r = new Request("VW Hui", c, n.GetReplaceSpecificationLocation(), n.GetDeleteSpecificationLocation(), 2, 0);
                ttsScheduler.AddRequest(r);
            }
        }