Browse Source
Fixed SD2-832: Running an external tool should use the ProcessRunner class. Made ProcessRunner use BeginOutputReadLine instead of running two threads for output reading. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3408 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
5 changed files with 84 additions and 181 deletions
@ -1,98 +0,0 @@
@@ -1,98 +0,0 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Diagnostics; |
||||
using System.IO; |
||||
using System.Text; |
||||
using System.Threading; |
||||
|
||||
namespace ICSharpCode.SharpDevelop.Util |
||||
{ |
||||
/// <summary>
|
||||
/// A threaded <see cref="Process.StandardOutput"/> or
|
||||
/// <see cref="Process.StandardError"/> reader.
|
||||
/// </summary>
|
||||
public class OutputReader |
||||
{ |
||||
StreamReader reader; |
||||
string output = String.Empty; |
||||
Thread thread; |
||||
|
||||
public event LineReceivedEventHandler LineReceived; |
||||
|
||||
public OutputReader(StreamReader reader) |
||||
{ |
||||
this.reader = reader; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Starts reading the output stream.
|
||||
/// </summary>
|
||||
public void Start() |
||||
{ |
||||
thread = new Thread(new ThreadStart(ReadOutput)); |
||||
thread.Name = "OutputReader"; |
||||
thread.Start(); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Gets the text output read from the reader.
|
||||
/// </summary>
|
||||
public string Output { |
||||
get { |
||||
return output; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Waits for the reader to finish.
|
||||
/// </summary>
|
||||
public void WaitForFinish() |
||||
{ |
||||
if (thread != null) { |
||||
thread.Join(); |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Raises the <see cref="LineReceived"/> event.
|
||||
/// </summary>
|
||||
/// <param name="line"></param>
|
||||
protected void OnLineReceived(string line) |
||||
{ |
||||
if (LineReceived != null) { |
||||
LineReceived(this, new LineReceivedEventArgs(line)); |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Reads the output stream on a different thread.
|
||||
/// </summary>
|
||||
void ReadOutput() |
||||
{ |
||||
output = String.Empty; |
||||
StringBuilder outputBuilder = new StringBuilder(); |
||||
|
||||
bool endOfStream = false; |
||||
while(!endOfStream) |
||||
{ |
||||
string line = reader.ReadLine(); |
||||
|
||||
if (line != null) { |
||||
outputBuilder.Append(line); |
||||
outputBuilder.Append(Environment.NewLine); |
||||
OnLineReceived(line); |
||||
} else { |
||||
endOfStream = true; |
||||
} |
||||
} |
||||
|
||||
output = outputBuilder.ToString(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue