[dba-VB] C# - Presenting process status

Shamil Salakhetdinov shamil at smsconsulting.spb.ru
Sun Nov 29 15:51:48 CST 2009


OK, here is another sample more close to VB6/VBA WithEvents approach:

using System;
using System.Windows.Forms;

namespace WinFormsSample
{
    public partial class Form2 : Form
    {
        // Create Windows Form Form2 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 class ProgressStatusEventArgs : EventArgs
            {
                public string Message { get; set; }
            }

            public event EventHandler<ProgressStatusEventArgs>
ProgressStatus;

            private static int _id;
            private System.Threading.Thread _thread;
            public void Run()
            {
                _testId = ++_id;

                System.Threading.ThreadStart ts =
                    new System.Threading.ThreadStart(runThread);
                _thread = new System.Threading.Thread(ts);
                _thread.IsBackground = true;
                _thread.Start();
            }

            private int _testId;
            private void runThread()
            {
                for (int i = 1; i < 10; i++)
                {
                    string message = string.Format("Test#{0}, cycle#{1}",
_testId, i);
                    ProgressStatusEventArgs e = new
ProgressStatusEventArgs();
                    e.Message = message;
                    // raise event
                    if (ProgressStatus != null)
                        ProgressStatus(this, e);

                    System.Threading.Thread.Sleep(500);
                }
            }
        }
        #endregion // Test class

        public Form2()
        {
            InitializeComponent();
        }

        private Test _test1;
        private void cmdTest1_Click(object sender, EventArgs e)
        {
            _test1 = new Test();
            _test1.ProgressStatus += new
EventHandler<Test.ProgressStatusEventArgs>(progressStatus);   
            _test1.Run();
        }

        private Test _test2;
        private void cmdTest2_Click(object sender, EventArgs e)
        {
            _test2 = new Test();
            _test2.ProgressStatus += new
EventHandler<Test.ProgressStatusEventArgs>(progressStatus);
            _test2.Run();
        }

        public delegate void ProgressStatusDelegate(string message);
        private void progressStatus(object sender,
Test.ProgressStatusEventArgs e)
        {
            if (this.InvokeRequired)
            {
                object[] args = { e.Message };
                this.Invoke(
                    new ProgressStatusDelegate(
                    progressStatusInThisFormThread),
                      args);
            }
            else
                progressStatusInThisFormThread(e.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;
            }
        }
    }
}

-----Original Message-----
From: dba-vb-bounces at databaseadvisors.com
[mailto:dba-vb-bounces at databaseadvisors.com] On Behalf Of Shamil
Salakhetdinov
Sent: Monday, November 30, 2009 12:33 AM
To: 'Discussion concerning Visual Basic and related programming issues.'
Subject: Re: [dba-VB] C# - Presenting process status

<<<
I will try to post about another one I use in the coming days...
>>>





More information about the dba-VB mailing list