今天想用C#調用crfs,可是老出問題。緣由有幾點。第一,我對crf不理解,雖然我用cmd跑了一遍,可是根本不理解爲何,並且只是草草看了下參數該輸入什麼,只是瞭解了形式,沒有了解實質。因此在調用的時候,我不知道怎樣轉移輸入輸出的參數。另外,crf_learn在cmd運行的時候,用到了一個自帶的dll文件我也不知道怎麼處理。並且我在網上找相似調用的例子也找不到。第二,對找到的實例代碼不熟悉,沒有理解每一行代碼的含義和做用。第三,不知道怎麼輸出結果,不會適當的斷點。shell
通過一位同窗的幫助,他幫我解決了以問題。最終運行成功。多線程
Console.WriteLine("aaaaa"); //用於測試輸出
System.Diagnostics.Process p = new System.Diagnostics.Process(); //開始系統進程
p.StartInfo = new System.Diagnostics.ProcessStartInfo(@"C:\Users\AMY\Desktop\test\crf_learn.exe"); //應用程序路徑
p.StartInfo.Arguments = @" C:\Users\AMY\Desktop\test\template C:\Users\AMY\Desktop\test\train.data C:\Users\AMY\Desktop\test\model"; //參數輸入
p.StartInfo.RedirectStandardOutput = true; //結果輸出
p.StartInfo.UseShellExecute = false; //是否在shell中顯示
p.Start();
//p.WaitForExit();
Console.WriteLine("nnnn");測試
p.Close() //要記得釋放資源,否則程序會很慢很慢的。
Console.ReadKey();pwa
dll文件在CRFs運行的時候是能夠本身找到的,只要你把它和learn.exe文件放在一個文件夾裏面。另外test的結果不能經過參數來重定向,因此,只能將輸出流保存到字符串,再保存到txt文件。現階段(2015.11.8)完整的代碼爲:線程
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;orm
private void start_CRFs_Click_1(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();進程
string TrainDirectory = Train_directoryT.Text;
string ArgumentsStr = tb_Arguments.Text;
string output = "";
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_learn.exe");
p.StartInfo.Arguments = ArgumentsStr + " " + TrainDirectory + "template " + TrainDirectory + "train.data " + TrainDirectory + "model";
string argStr = p.StartInfo.Arguments;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
tbtrain_result.Text = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();資源
// System.Threading.Thread.Sleep(50000); 最好能用多線程來處理
System.Diagnostics.Process p2 = new System.Diagnostics.Process();
p2.StartInfo = new System.Diagnostics.ProcessStartInfo(TrainDirectory + "crf_test.exe");//須要啓動的程序名
p2.StartInfo.Arguments = " -m " + TrainDirectory + "model " + TrainDirectory + "test.data";
p2.StartInfo.RedirectStandardOutput = true;
p2.StartInfo.UseShellExecute = false;
p2.Start();
output = p2.StandardOutput.ReadToEnd();
TbTest_outputT.Text = output;
byte[] buffer = Encoding.Default.GetBytes(output);
File.WriteAllBytes(TrainDirectory + "output.txt", buffer);
p2.Close();
sw.Stop();
TimeSpan ts = sw.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
TimeSpanL.Text = "用時:" + elapsedTime;
}字符串
一些輸入輸出定義的變量用的時候記得先定義好。cmd
其實不少不會的知識點,或是一些知識點的細節都是百度到的,記得好的筆記真心讓人受益不淺。最後程序也算是成功的跑起來了,因此,我把學會的東西記下來,一來是能夠往後本身複習,二來也能夠跟你們一塊兒分享