By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,877 Members | 1,100 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,877 IT Pros & Developers. It's quick & easy.

Process StandardOutput and StandardError on seperate threads.

P: n/a
Hi all,

I have reposted this question from dotnet.general as I have been advised
that this is a more appropriate forum for this question. Apologies for the
repost.

I have a process thats starts in my application and only terminates when my
application is terminated. I want to write the output and the errors of this
process to a seperate log file. In order to do this, I spawned two threads.

My code looks something like this

' Starting the process
oProcessStartInfo = New ProcessStartInfo()
With oProcessStartInfo
.FileName = strFilename
.Arguments = strArguments
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
oProcess = Process.Start(oProcessStartInfo)
' Starting the threads
oOutputThread = New Thread(AddressOf ReadStdOut)
oErrorThread = New Thread(AddressOf ReadStdError)
With oOutputThread
.Name = "StandardOutput"
.Priority = ThreadPriority.BelowNormal
.Start()
End With

With oErrorThread
.Name = "StandardError"
.Priority = ThreadPriority.BelowNormal
.Start()
End With

Private Sub ReadStdOut()
' Has to run in a seperate thread
' ReadtoEnd will work only if the process is getting terminated.
Dim str As String = oProcess.StandardOutput.ReadLine
Try
Do While str.Length >= 0
If str.Length <> 0 Then
Me.oLog.WriteLog("Standard Output : " & str) ' Writes to
a log file.
End If
str = oProcess.StandardOutput.ReadLine
Loop
Catch
Return
End Try
End Sub

I have a similair ReadStdError function and both share the same instance of
the logging class.
When writing in the log class I implement ReadWriteLock

ReadWriteLock.AcquireWriterLock(System.Threading.T imeout.Infinite)
Try
With oStreamWriter
.BaseStream.Seek(0, SeekOrigin.End)
.WriteLine(sDate & " : " & sMessage)
End With
Finally
ReadWriteLock.ReleaseWriterLock() ' Release the write lock.
End Try
I would like to know if this is the best approach. It works well for me.
However I felt that if I have an infinite loop while reading the standard
output stream, my application would be memory and process intensive and that
hasnt been the case. So I am a bit curious to know why it hasnt been
intensive.

Couple of additional points (not sure of its impact to my question)
- The process doesnt has a irregular stream of data coming from Standard
Output and its not very oft occuring.
- The StandardError by its very nature also doesnt have regular data coming
from it unless there is a real issue. I dont expect any errors if my setups
are correct.
- The Do While Loop should constantly be checking ReadLine - and thats my
real concern

Greateful for any thoughts you may have. I am a complete greenhorn in
threading.

Regards,
Wazir

Jul 21 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Please ignore this email. I posted to this group by mistake :(
Jul 21 '05 #2

P: n/a
Hi Mwazir,

This is still the dotnet.general

:-)

Cor
Jul 21 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.