You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
5.5 KiB
153 lines
5.5 KiB
using Microsoft.IO; |
|
using System; |
|
using System.Diagnostics; |
|
using System.IO; |
|
using System.Linq; |
|
using System.Threading; |
|
|
|
namespace Kingo.ThreadManager |
|
{ |
|
public delegate void ProcessHandler(object setp); |
|
public class CustomProcess |
|
{ |
|
private static readonly RecyclableMemoryStreamManager streamManager = new RecyclableMemoryStreamManager(); |
|
private static readonly byte[] end = new byte[] { 69, 78, 68, 33, 10 }; |
|
public ProcessHandler ProcessCallback; |
|
|
|
private Process process; |
|
public CustomProcess(string pExePath) |
|
{ |
|
ProcessStartInfo startInfo = new ProcessStartInfo() |
|
{ |
|
FileName = pExePath, |
|
CreateNoWindow = true, |
|
RedirectStandardOutput = true, |
|
RedirectStandardInput = true, |
|
UseShellExecute = false, |
|
StandardOutputEncoding = System.Text.Encoding.UTF8 |
|
}; |
|
process = Process.Start(startInfo); |
|
} |
|
/// <summary> |
|
/// 程序是否已经退出 |
|
/// </summary> |
|
public bool IsExited |
|
{ |
|
get { return process.HasExited; } |
|
} |
|
private object lockObj = new object(); |
|
/// <summary> |
|
/// 是否正在忙 |
|
/// </summary> |
|
public bool IsBusy { get; private set; } |
|
public DateTime StartTime { get; private set; } = DateTime.Now; |
|
byte[] buffer = new byte[1024 * 1024]; |
|
|
|
public void ExeTask(string pParm, ProcessHandler pProcessCallback) |
|
{ |
|
this.ProcessCallback = pProcessCallback; |
|
this.IsBusy = true; |
|
this.StartTime = DateTime.Now; |
|
try |
|
{ |
|
process.StandardInput.WriteLine(pParm); |
|
process.StandardInput.WriteLine("TaskStart"); |
|
using (MemoryStream memoryStream = streamManager.GetStream()) |
|
{ |
|
while (!TestEnd(memoryStream)) |
|
{ |
|
int count = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); |
|
memoryStream.Write(buffer, 0, count); |
|
|
|
//lock (lockObj) |
|
//{ |
|
var content = memoryStream.ToArray(); |
|
var realLength = content.Length; |
|
//处理头部 |
|
int headerEndIndex = 0; |
|
|
|
int sIdx = -1; |
|
int tIdx = -1; |
|
for (int i = 0; i < realLength; i++) |
|
{ |
|
int j = 0; |
|
if (i > 0) |
|
j = i - 1; |
|
if (content[i] == (byte)91) |
|
{ |
|
sIdx = i; |
|
} |
|
if (content[i] == (byte)93) |
|
{ |
|
tIdx = i; |
|
} |
|
//if (content[i] == (byte)35 && content[j] == (byte)35) |
|
//{ |
|
// sIdx = tIdx; |
|
// tIdx = i; |
|
// //break; |
|
//} |
|
} |
|
if (sIdx != -1 && tIdx != -1) |
|
{ |
|
var contenttye2 = System.Text.Encoding.UTF8.GetString(content, 0, content.Length); |
|
var contenttye = System.Text.Encoding.UTF8.GetString(content, sIdx + 1, tIdx - sIdx - 1); |
|
ProcessCallback?.Invoke(contenttye); |
|
Thread.Sleep(1000); |
|
} |
|
//} |
|
} |
|
{ |
|
var content = memoryStream.ToArray(); |
|
var realLength = content.Length - end.Length; |
|
//处理头部 |
|
int headerEndIndex = 0; |
|
for (int i = 0; i < realLength; i++) |
|
{ |
|
if (content[i] == (byte)10) |
|
{ |
|
headerEndIndex = i; |
|
//break; |
|
} |
|
} |
|
|
|
var contenttye = System.Text.Encoding.UTF8.GetString(content, headerEndIndex + 1, realLength - headerEndIndex - 1); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw ex; |
|
} |
|
finally |
|
{ |
|
IsBusy = false; |
|
} |
|
} |
|
|
|
private bool TestEnd(MemoryStream memoryStream) |
|
{ |
|
if (memoryStream.Length == 0) |
|
return false; |
|
byte[] endBuffer = new byte[end.Length]; |
|
memoryStream.Seek(-end.Length, SeekOrigin.End);// = memoryStream.Length - end.Length; |
|
memoryStream.Read(endBuffer, 0, endBuffer.Length); |
|
if (endBuffer.SequenceEqual(end)) |
|
{ |
|
//memoryStream.SetLength(memoryStream.Length - end.Length); |
|
return true; |
|
} |
|
return false; |
|
} |
|
/// <summary> |
|
/// 退出程序,杀掉进程 |
|
/// </summary> |
|
public void Exit() |
|
{ |
|
if (!process.HasExited) |
|
{ |
|
process.Kill(); |
|
} |
|
} |
|
} |
|
}
|
|
|