نخ ها Thearding) یکی از بهترین امکان برای استفاده بهینه منابع هست با این حال خیلی مورد بی توجهی قرار می گیره. مثلاً با این موضوع بر خرده باشید که وقتی حلقه ای بینهایت یا طولانی داریم و نیاز هست که در هنگام پردازش حلقه به رویداد های دیگه رسیده مورد تقاضای کاربر جواب بده در این حالت یا شما باید از دستور Doevents استفاده کنید که اصلاً توصیه نمی شه چون اجرای این دستور حدوداً یک میلی ثانیه تاخیر ایجاد می کنه و اگر حلقه من 10000 هزار بار تکرار بشه در برنامه من به صورت ناخواسته 10 ثانیه وقت تلف می شه (برای پاسخ به رویداد های دیگر ) برای این منظور از نخ ها استفاده که کارایی برنامه شما رو به صورت چشم گیری افزایش می دهد من یک حلقه بزرگ رو مثال می زنم ک من در اینجا قصد دارم یک جستجو در یک مسیر خاص در درایوم رو به شما نشون بدم لازم به ذکر هست که این برنامه تمام مسیر یعنی تمام زیر شاخه ها رو هم در بر می گیره: این هم یک مثال ساده تا بهتر متوجه بشیم: کد PHP: PublicEnum StatC vbStop = 0 vbRun = 1 vbPause = 2 EndEnum Dim Stat_1 As StatC Dim Tr As Threading.Thread برای آغاز کار Public Sub Start() If Stat = StatC.vbStop Then Me.Tr = New Thread(New ThreadStart(AddressOf Me.Roshan)) Tr.Priority =ThreadPriority.Highest Tr.Start() EndIf End sub برای ادامه وقتی که Pause استفاده شود Public Sub Resume_() IfNot IsNothing(Tr) Then Tr.Resume() Stat_1 = StatC.vbPause EndSub برای توقف موقت PublicSub Pause() IfNot IsNothing(Tr) Then Tr.Suspend() Stat_1 = StatC.vbPause EndSub برای از بین بردن Public Sub _Stop() IfNot IsNothing(Tr) Then Tr.Abort() Stat_1 = StatC.vbStop EndSub پردازه بی نهایت PrivateSub Roshan() While (1) ....دستورات شما End While EndSub قسمتی که به رنگ قرمز در آمده است این قسمت اهمیت این نخ را برای سیستم عامل شرح می دهد و اولویت این نخ بر اساس این متد تغییر می کند پس از آن به درستی استفاده کنید.
این کد زمان روشن بودن کامپیوتر رو بر حسب میلی ثانیه بر میگرداند. این قابلیت میتونه خیلی کارامد باشه در ضمن چون در یک متغیر 32 بیتی ذخیره میشود پس از 24 روز مقدار آن صفر میشود. کد: کد: System.Environment.TickCount __________________
این هم ایجاد یک شی در زمان اجرا و انتصاب رویداد کلید در زمان اجرا به آن شی : کد: کد: Dim Bt As New ButtonPrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.LoadBt.Parent = MeBt.Location = New Point(Me.Width / 2, Me.Height / 2)Bt.Text = "Ok"AddHandler Bt.Click, AddressOf BtClickEndSubPrivateSub BtClick(ByVal sender As Object, ByVal e As EventArgs)MsgBox("Hello ...")EndSub همه رویداد همه اشیا از همین سبک قابل هدایت هستند.
دوست عزیزمان ساختن باتون در زمان اجرا را گفتند ، من هم Move کردن این باتون در زمان اجرا رو میگم. البته این کار بدون استفاده از Api ها هست کد: Dim mouse_offset As Point Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown mouse_offset = New Point(-e.X, -e.Y) End Sub Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove If e.Button = Windows.Forms.MouseButtons.Left Then Dim mousePos As Point = sender.MousePosition mousePos.Offset(mouse_offset.X - Button1.Height, mouse_offset.Y - Button1.Width) sender.Location = mousePos End If End Sub __________________
این دفعه شما رو با Code Snippet ها اشنا میکنم. Code Snippet ها کد های کوچک شده ایی هستند که باعث تسهیل در کد نوشتن میشوند. برای اینکه با این کد ها آشنا بشین در محیط کد نویسی ویژوال استادیو کلیک راست کنید و گزینه ی Insert Snippet ر وانتخاب کنید . ملاحضه میکنین که لیستی از این کد ها رو براتون میاره برای نمونه ایتم Windows Operating System\Find the current user رو انتخاب بکنین ملاحضه میکنین که متغیری تعریف میکنه که نام کاربر جاری در آن ذخیره شده. این کدها کار برنامه نویس رو خیلی راحت تر میکنه. (به زودی نحوه ی ساخت این کد ها رو کامل بهتون میگم.). یکی از تفاوت هایی که ویژوال 2005 با نسخه های قبلی داره همین Code Snippet هاست. مثلا در دات نت حلقه ی For یک CodeSnippet هست. برای اینکه بتونید سریع تر به ساختار این کد ها دسترسی داشته باشین پس از نوشتن اسم انها(مثلا For) کلید TAB رو بزنید ملاحضه میکنین که چه اتفاقی صورت میگیره