الأحد، 16 يونيو 2013

لنتعرف على احد مكونات ال visual basic 2005 المهمه ال BackGround Worker

سم الله الرحمن الرحيم
لنتعرف على احد مكونات ال visual basic 2005 المهمه ال BackGround Worker
طبعا يا مشاغبين لغه البرمجه visual basic 2008 او ما يسمى ORCAS اقتربت من الظهور (ظهرت نسخه beta2 قبل فتره ) و نحن ما زلنا لم نتعرف على مكونات النسخه visual basic 2005 كامله , و هو امر يدعو الى الاحباط لان كل اهتماماتنا في البرمجه و حتى ان كنا محترفين تتجاهل التجديد الامر الذي يبقينا خلف الجميع
اليوم و في هذا الموضوع الذي اكتبه مع ضيق الوقت ساحاول ان اشرح الاضافه الجديده في ال visual basic 2005 و التي تسما BACKGROUND WORKER و هو عنصر تحكم مثل الزر او صندوق النص او المؤقت الذي نضيفه الى برنامجنا و نحن نصمم به .
ما الفائده منه :الاجابه عن هذا السؤال طويله و لكن ساحاول الاختصار , كل مبرمج يكتب برنامج يقوم بعمليه طويله جدا تستهلك قدره المعالج و الكثير من الوقت كان يلجأ الى حلها باستخدام ال threads و طبعا استعمال ال threads مش سهل و محتاج الى الكثير من الدقه و انك تكتب برنامج يكون multithread اتوقع انه شيء صعب و العمليات الحسابيه الطويله و المعقده تستهلك قدره العالج و العمليات التي يتم فيها معالجه قدر كبير من البيانات تستهلك الذاكره مثلا البحث عن اسم شخص في قاعده بيانات تحتوي على مليون اسم او القيام بالعمليات الحسابيه التي تشمل ال recursion relation و ما الى ذلك , لكن ميكروسوفت عملت على اضافه هذا المكون الرائع و الجديد ( اقوم حاليا باعاده كتابه الكثير من ال alogrthems باستعماله ) جعلت عمليه البرمجه اسهل و تنفيذ البرنامج اسرع
لذلك بنستعمل ال background worker و نضيفه الى المشروع و نربط فيه عمليه طويله و نشوف كيف سيتم تنفيذ البرنامج

نبدأ
اولا اعمل مشروع جديد في ال visual basic 2005 و سميه BGWORKER و احفظه
ثانيا اضف التالي الى ال form الخاص بالمشروع
*****زر سميه btnStartProcess
*****رز اخر سميه btnCancelProcess
*****شريط تقدم ProgressBar و سميه prgLongProcess
*****اخيرا اضف BackGroundWorker الى الForm و سميه brgLongProcess
الان وقت الكود
اولا نذهب الى الزر الذي اسميناه btnStartProcess و ننقر مزدوجا لفتح صفحة تحرير الكود و نضيف الكود التالى


btnStartProcess.Enabled = False
btnCancel.Enabled = True
prgLongProcess.Value = 0

' Start the worker.
bgrLongProcess.WorkerReportsProgress = True
bgrLongProcess.WorkerSupportsCancellation = True
bgrLongProcess.RunWorkerAsync()
ما يهم هو اخر 3 اسطر حيث اننا قمنا بربط الحدث click للزر مع ال backGroundWorker و شغلناه و فعلنا خاصيه ايقاف تنفيذ العمل
بالنسبه اللزر الثاني المسمى btnCancelProcess و ظيفته ان يقوم بالغاء او ايقاف العمليه التي تكون تحت التنفيذ( تذكرو قد تكون عمليه طويله )
و نضع فيه الكود التالي
bgrLongProcess.CancelAsync()

الان نقر مزدوج على ال backGround Worker و نذهب الى الحدث ProgressChanged و نضع فيه الكود التالي


prgLongProcess.Value = e.ProgressPercentage



حيث اننا قمنا بتعيين قيمه ال value لشريط التقدم progressPar الذي وضعناه من قيمه التقدم او النجاح الذي قام به ال backGround worker

الكود المهم هو في الحدث DoWork الخاص بال BackGround Worker و هنا نضع الSubRoutine الذي يمثل العمل الطويل
و ان اضع هذه العمليه التي تستغرق بعض الوقت
و الكود التالي

For i As Integer = 1 To 10000

For j As Integer = 1 To 10000

Next j
If bgrLongProcess.CancellationPending Then Exit Sub

bgrLongProcess.ReportProgress(CInt(100 * i / 10000))
Next i
و هيك بنكون انتهينا
الان شغل البرنامج و جرب بدون backGroundWorker و شغل البرنامج
عندها ستستشعر اهميته
الرجاء الرد و التقييم
الكود كامله
في الاسفل
Imports System
Imports System.Data
Imports System.Collections
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Data.SqlClient

public class MainClass
Shared Sub Main()
Dim form1 As Form = New Form1
Application.Run(form1)
End Sub
End Class


Public Class Form1
' Start the long process.
Private Sub btnStartProcess_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStartProcess.Click
' Get ready.
btnStartProcess.Enabled = False
btnCancel.Enabled = True
prgLongProcess.Value = 0

' Start the worker.
bgrLongProcess.WorkerReportsProgress = True
bgrLongProcess.WorkerSupportsCancellation = True
bgrLongProcess.RunWorkerAsync()
End Sub

' Cancel the long process.
Private Sub btnCancel_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCancel.Click
bgrLongProcess.CancelAsync()
End Sub

' Display the progress.
Private Sub bgrLongProcess_ProgressChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
Handles bgrLongProcess.ProgressChanged
prgLongProcess.Value = e.ProgressPercentage
End Sub

' The worker is done.
Private Sub bgrLongProcess_RunWorkerCompleted(ByVal sender As Object, _
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles bgrLongProcess.RunWorkerCompleted
btnStartProcess.Enabled = True
btnCancel.Enabled = False
End Sub

Private Sub bgrLongProcess_DoWork(ByVal sender As Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgrLongProcess.DoWork
For i As Integer = 1 To 10000

For j As Integer = 1 To 10000

Next j
If bgrLongProcess.CancellationPending Then Exit Sub

bgrLongProcess.ReportProgress(CInt(100 * i / 10000))
Next i
End Sub

End Class



<Global.Microsoft.VisualBasic.CompilerServices.Des ignerGenerated()> _
Partial Public Class Form1
Inherits System.Windows.Forms.Form

'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.btnStartProcess = New System.Windows.Forms.Button
Me.btnCancel = New System.Windows.Forms.Button
Me.prgLongProcess = New System.Windows.Forms.ProgressBar
Me.bgrLongProcess = New System.ComponentModel.BackgroundWorker
Me.SuspendLayout()
'
'btnStartProcess
'
Me.btnStartProcess.Location = New System.Drawing.Point(8, 8)
Me.btnStartProcess.Name = "btnStartProcess"
Me.btnStartProcess.Size = New System.Drawing.Size(75, 23)
Me.btnStartProcess.TabIndex = 0
Me.btnStartProcess.Text = "Start"
'
'btnCancel
'
Me.btnCancel.Location = New System.Drawing.Point(208, 8)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(72, 24)
Me.btnCancel.TabIndex = 1
Me.btnCancel.Text = "Cancel"
'
'prgLongProcess
'
Me.prgLongProcess.Location = New System.Drawing.Point(8, 48)
Me.prgLongProcess.Name = "prgLongProcess"
Me.prgLongProcess.Size = New System.Drawing.Size(272, 16)
Me.prgLongProcess.TabIndex = 2
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(288, 75)
Me.Controls.Add(Me.prgLongProcess)
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnStartProcess)
Me.Name = "Form1"
Me.Text = "UseBackgroundWorker"
Me.ResumeLayout(False)

End Sub
Friend WithEvents btnStartProcess As System.Windows.Forms.Button
Friend WithEvents btnCancel As System.Windows.Forms.Button
Friend WithEvents prgLongProcess As System.Windows.Forms.ProgressBar
Friend WithEvents bgrLongProcess As System.ComponentModel.BackgroundWorker

End Class

ليست هناك تعليقات:

إرسال تعليق