Shamil Salakhetdinov
shamil at smsconsulting.spb.ru
Sun Nov 29 15:33:05 CST 2009
Hi John,
Here is one of the methods I use (there are zillion combinations) - I dunno
where it comes from, did I borrowed it from somewhere or I got it elaborated
myself, is it recommended way or not - but it just works, and I have
"cooked" it for you here from scratch - this is codebehind for Windows Form
named Form1:
using System;
using System.Windows.Forms;
namespace WinFormsSample
{
public partial class Form1 : Form
{
// Create Windows Form Form1 with three controls:
//
// 1. Button: cmdTest1 -> cmdTest1_Click
// 2. Button: cmdTest2 -> cmdTest2_Click
// 3. TextBox: txtLog (Multiline = true)
#region Test class
public class Test
{
public delegate void ProgressStatus(string message);
private static int _id;
private System.Threading.Thread _thread;
public void Run(ProgressStatus progressStatus)
{
_testId = ++_id;
_progressStatus = progressStatus;
System.Threading.ThreadStart ts =
new System.Threading.ThreadStart(runThread);
_thread = new System.Threading.Thread(ts);
_thread.IsBackground = true;
_thread.Start();
}
private int _testId;
private ProgressStatus _progressStatus;
private void runThread()
{
for (int i = 1; i < 10; i++)
{
_progressStatus(string.Format("Test#{0}, cycle#{1}",
_testId, i));
System.Threading.Thread.Sleep(500);
}
}
}
#endregion // Test class
public Form1()
{
InitializeComponent();
}
private Test _test1;
private void cmdTest1_Click(object sender, EventArgs e)
{
_test1 = new Test();
_test1.Run(progressStatus);
}
private Test _test2;
private void cmdTest2_Click(object sender, EventArgs e)
{
_test2 = new Test();
_test2.Run(progressStatus);
}
private void progressStatus(string message)
{
if (this.InvokeRequired)
{
object[] args = { message };
this.Invoke(
new Test.ProgressStatus(
progressStatusInThisFormThread),
args);
}
else
progressStatusInThisFormThread(message);
}
private static object _statusMessageOutputLocker = new object();
private void progressStatusInThisFormThread(string message)
{
lock (_statusMessageOutputLocker)
{
txtLog.Text =
String.Format("{0:hh:mm:ss.fff}: {1}",
DateTime.Now,
message) +
System.Environment.NewLine +
txtLog.Text;
}
}
}
}
I will try to post about another one I use in the coming days...
Thank you.
--
Shamil
-----Original Message-----
So how do you folks display status information in a form?
--
John W. Colby
www.ColbyConsulting.com