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