بهار  ۸۸

تاریخ انتشار:

برنامه نویسی

موضوع :

چند رشته ای در #C  بخش دوم

عنوان مقاله :

               
           

چکیده:

 
 

کارگر پس‌زمینه (Background Worker) یکی از ابزارهای مفید برای پیاده‌سازی چند رشته‌ای در برنامه می‌باشد. این ابزار قابلیت ارائه گزارش پیشرفت کار را داشته و هرگاه به پایان می‌رسد یک رویداد را ایجاد می‌کند. بکارگیری آن در برنامه بسیار ساده است.

 
   
               
 

ابزار کارگر پس‌زمینه یا (Background Worker) را می‌توان مانند هر ابزار دیگر به برنامه افزود. پس از افزودن آن می‌توان رویدادهای آن را برنامه‌نویسی کرد. کارگر پس‌زمینه دارای سه رویداد است:

شکل یک: ابزار کارگر پس‌زمینه

  DoWork  : در آن کاری که باید توسط رشته دوم انجام شود (معمولا کار زمان‌گیر) قرار داده می‌شود.

  ProgressChanged  : این رویداد  زمانی که پیشرفت کار تغییر می کند برانگیخته می‌شود و در آن باید کدی را قرار داد که به کاربر میزان پیشرفت کار را اطلاع دهد.

  RunWorkerCompleted  : این رویداد زمانی برانگیخته می‌شود که کار سپرده شده به کارگر پس‌زمینه به پایان رسیده باشد.

همچنین باید توجه داشت که اگر بخواهیم گزارش پیشرفت را ارائه کنیم باید خصوصیت WorkerReportsProgress را برابر True قرار دهیم. همچنین برای اینکه امکان لغو عملیات را داشته باشیم باید خصوصیت WorkerSupportsCancellation را برابر True قرار دهیم.

شکل دو : خصوصیاتی که باید True شوند

 طرح مسئله:

می‌خواهیم یک برنامه ساده بنویسیم که در آن یک کار طولانی مانند شمارش از یک تا دویست ملیون در یک رشته جداگانه اجرا شود. در این حالت برنامه اصلی همچنان در تعامل (interaction) با کاربر می‌ماند. همچنین برنامه می‌تواند به درخواست کاربر برای نمایش پیام پاسخ دهد.

کاربر با زدن کلید شمارش عمل شمارش را در یک رشته جدا که توسط کارگر پس‌زمینه اجرا می شود آغاز می‌کند. هرگاه عمل شمارش یک درصد پیشرفت کند کارگر پس زمینه به برنامه اصلی گزارش می‌دهد و میله پیشرفت مقدار پیشرفت را نشان می‌دهد و متن زیر آن درصد پیشرفت را بیان میکند.

پس از زدن کلید شمارش برنامه وارد حالت شمارش شده و عنوان و کارکرد کلید شمارش به انصراف تغییر می‌یابد. اگر در این حالت کلید انصراف زده شود کارگر پس زمینه مقدار خصوصیت CancellationPending  را true نموده و این عمل موجب متوقف شدن شمارش می‌شود.

پرچم FLAG نگهدارنده دو حالت شمارش و آماده است اگر مقدار آن True باشد برنامه آماده شمارش است و کلید شمارش فعال می باشد. در حالت شمارش مقدار آن False شده و کلید شمارش به کلید انصراف تغییر عنوان می دهد در این حالت زدن کلید انصراف به معنی متوقف کردن عمل شمارش است.

 شکل سه - برنامه در حال اجرا به درخواست کاربر پاسخ می دهد.

   کد برنامه:

namespace BackgroundWorker

{

    public partial class frmMain : Form

    {

        public bool FLAG = true;

        public long MAX = 200000000;

        public frmMain()

        {

            InitializeComponent();

        }

 

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

        {

            int i = 1;

            for (long l = 0; l < MAX; l++)

            {

                if (l == (long)(MAX / 100) * i)

                {

                    backgroundWorker1.ReportProgress(i);

                    i++;

                }

                if (backgroundWorker1.CancellationPending)

                {

                    e.Cancel = true;

                    return;

                }

            }

        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

        {           

            prgsBar.Value = e.ProgressPercentage;

            lblReport.Text = "شمارش در حال انجام است لطفا بردباری کنید  " + "( " + e.ProgressPercentage.ToString() + "

            درصد" + " ) ";

            this.Update();

        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        {

            lblReport.Visible = false;

            prgsBar.Visible = false;

            btnCountStop.Text = "شمارش";

            FLAG = true;           

        }

        private void btnMsg_Click(object sender, EventArgs e)

        {

            MessageBox.Show("برنامه به درخواست کاربر پاسخ می دهد", "نمایش پیام", MessageBoxButtons.OK,

            MessageBoxIcon.Asterisk);

        }

        private void btnCountStop_Click(object sender, EventArgs e)

        {

            if (FLAG)

            {

                lblReport.Visible = true;

                prgsBar.Visible = true;

                btnCountStop.Text = "انصراف";

                toolTip1.SetToolTip(this.btnCountStop, "Cancel");

                backgroundWorker1.RunWorkerAsync();

                FLAG = false;

            }

            else

            {

                lblReport.Visible = false;

                prgsBar.Visible = false;

                btnCountStop.Text = "شمارش";

                toolTip1.SetToolTip(this.btnCountStop, "Counting");

                backgroundWorker1.CancelAsync();                  

                FLAG = true;

            }

        }

        private void btnExit_Click(object sender, EventArgs e)

        {

            this.Close();

        }

    }

}