PDA

View Full Version : سوال: طرز نوشتن thread



roya_hh
چهارشنبه 07 اسفند 1387, 08:50 صبح
سلام.
دوستان من تا حالا هیچ استفاده ای از thread نکرده ام . حتی نمی دونم باید کجا و چطوری بنویسم. نمی دونم چه مزیتی برام داره. اما مجبورم برای یک قسمت از برنامه ام که یک select است از thread استفاده کنم. اگه میشه کمکم کنید. ممنون

roya_hh
چهارشنبه 07 اسفند 1387, 12:50 عصر
هیچ کس بلد نیست thread بنویسه؟

anooshiran
چهارشنبه 07 اسفند 1387, 19:29 عصر
سلام دوست عزيز

اين يك برنامه ساده براي استفاده از thread است كه شرح كامل و كافي هم داره.

اين برنامه رو ببين اگر مشكلت حل نشد توضيح بده كه دقيقا چه ميخواهي انجام دهي

anooshiran
چهارشنبه 07 اسفند 1387, 22:22 عصر
با سلام خدمت تمام اساتيد و دوستان محترم
مقاله مختصر زير را جهت دوستاني كه تا به حال با مفهوم Thread آشنا نبوده اند به رشته تحرير در آورده ام. از دوستان عزيز به علت ناشيوايي نثر و عدم دانش كافي خود پوزش خواسته و اميدوارم اساتيد محترم اين سايت در اين زمينه ها بيشتر به اطلاع رساني به بقيه دوستان بپردازند
--------------------------------------------------------------

Thread : در لغت به معناي نخ ، رشته يا زنجيره است
در برنامه سازي به فرآيندي گفته مي شود كه بخشي از يك فرآيند بزرگتر يا برنامه است.
هر برنامه داراي يك Thraed اصلي يا Main Thraed است كه با شروع برنامه تا پايان آن ، وظيفه اجراي كدها را بطور زنجيروار و پيوسته و منطبق بر كد ها و منطق برنامه بر عهده دارد.به عبارتي پيوسته اجراكردن كدها از ابتدا تا انتها.
اين تعريف نشان ميدهد كه يك برنامه در حالت معمول و در زمان اجرا و در هر لحظه نميتواند بيش از يك وظيفه يا Task را به عهده بگيرد و به عبارتي داراي خاصيت Single Processing است.

Single Tasking يا Single Processing
در عهد پروسسورهاي 80286 يا 80386 كه هنوز OS رايج براي Pc ها MS_DOS بود پروسسورها فقط توان اجراي يك برنامه را در لحظه داشتند و براي اجراي برنامه جديد حتما بايد برنامه قبل به پايان مي رسيد. يعني سيستم توان پردازش همزمان را نداشت. البته در آن زمان هم سيستم ها پيشرفته اي مثل SUN2000 كه از چند پردازنده موازي استفاده ميكرد امكان Multi Processing را داشت كه با توجه به قيمت فوق العاده بالاي آن در اختيار عموم نبود و فقط مراكز علمي يا تحقيقاتي امكان استفاده از آن را داشتند. كه بيشتر هم در بحث Simulation توسط بسياري از مراكز علمي بكار برده ميشد.
من به خاطر دارم كه در سال 1372 مركز تحقيقات علوم پايه زنجان صرفنظر از قيمت حدود دويست هزار دلاري ، نياز به تهيه يكي از اين سيستم ها داشت كه به علت تكنولوژي جديد آن، High Tech محسوب ميشد و كمپاني سازنده حق فروش آن را به ايران نداشت. بگذريم.

Multi Tasking يا Multi Processing
از زمان انتشار Windows 95 و همچنين ورود به دوران پروسسورهاي پنتيوم بحث Multi Processing وارد دنياي Pc ها گرديد. از آن زمان است كه ميتوان در حال برنامه نويسي ، موزيك گوش داد و احتمالا فايلي را دانلود كرد و حتي با دوستي چت نمود.
من شرح مختصر فوق را مطرح نمودم تا بتوانم مفهوم Multi Thread را بهتر روشن كنم.
همانطور كه در بالا مطرح نمودم برنامه به وسيله Main Thread يك وظيفه خاص براي اجراي كد هاي برنامه را بصورت پيوسته به عهده دارد. حال فكر كنيد كه برنامه وارد لوپي گرديده كه مثلا ميخواهد از 1 تا 1000000000 را با هم جمع كنديا مثلا وارد ماژولي گرديده كه بايد چنيدن Email بفرستد يا در يك شبكه منتظر دسترسي به يك DataBase و خواندن چند Table سنگين است. اينها پردازش هاي زمان بري هستند و Main Thread وظيفه دار اتمام و ادامه روند برنامه مي باشند و User بايد صبر كند تا اين Process پايان پذيرد.
حال تكليف ادامه برنامه چه ميشود . اگر خواسته باشيد كه در زمان اجراي اين Process هاي نسبتا طولاني User به كار ديگري مثلا پركردن Textbox هاي روي فرم يا انتخاب از چند combobox بپزدازد چه مي توانيد بكنيد.
يا فرض كنيد كه همزمان مي خواهيد چندين Form را باز كرده و در تمام آنها كار كنيد. در يك Form محاسبه خاصي را انجام داده و تا زماني كه منتظر اتمام آن محاسبه هستيد در Form ديگر به فعاليت ديگري مشغول شويد.

اينجاست كه بحث Multi Thread به ميان مي آيد.
اين بدين معناست كه ميتوان اين Process ها زمان بر را در قالب يك Thread جديد تعريف كرد تا بطور موازي با Main Thread به Process بپردازند. اين يعني صرفه جويي در وقت و زمان . يا به عبارتي Multi Processing .
اگر دوستان مايل باشند كه نمونه اي ازيك برنامه Multi Thread را از C# به VB برگدانده و در تاپيك بالا گذاشته ام كه متاسفانه منبع اصلي آن را فراموش نموده ام. ولي برنامه ايست با توضيحات كافي و وافي. بخصوص براي كساني كه با اين مقوله آشنايي ندارند.
خوشحال خواهم گرديد كه اين بحث ادامه يابد.

baran_mehr
جمعه 09 اسفند 1387, 12:07 عصر
سلام ابجی .خوبی؟
سه سری به این آدرس بزن:
http://barnamenevis.org/forum/showthread.php?t=143881

roya_hh
شنبه 10 اسفند 1387, 10:07 صبح
سلام.
راستش نمی دونم اصلا نیازی به استفاده از thread هست یا نه. من می خواهم یک select انجام بدهم که بیاد و چک کنه ببینه یک مقدار ورودی در یک جدول از db وجود دارد یا نه.
حالا اصلا به نظر شما نیاز به thread هست یا نه؟

Developer Programmer
شنبه 10 اسفند 1387, 10:14 صبح
ترید باعث میشه برنامه شما به صورت پارالل اجرا بشه
یعنی در حالیکه برنامه تون روال عادی رو انجام میده، نتیجه Select هم جداگانه محاسبه بشه.
عموما برای برنامه هایی که تعداد رکوردهاشون زیاده و Select زمان زیادی تلف میکنه، از ترید استفاده میکنن تا برنامه مدت زیادی به حالت Freeze نره

کتابهای زیادی هم واسه اینکار تو اینترنت موجوده. اما اگه فارسی میخوای،


http://s5.tinypic.com/2ynp540.jpg

Visual Basic .NET How to Program

roya_hh
شنبه 10 اسفند 1387, 11:02 صبح
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim tr1 As System.Threading.Thread
tr1 = New System.Threading.Thread(AddressOf aaa)
tr1.Priority = ThreadPriority.Normal
tr1.Start()
tr1 = New System.Threading.Thread(AddressOf aaa)
tr1.Abort()
End Sub

Private Sub aaa()
MsgBox("msg")
End Sub

اگر بخواهم تابع aaa با یک پارامتر فراخوانی شود چکاری باید انجام بدهم؟



Private Sub aaa(ByVal text As String)
MsgBox("msg")
End Sub

baran_mehr
شنبه 10 اسفند 1387, 13:12 عصر
سلام ابجی.
شما میتونید از Function استفاده کنید.و هم میتونید ورودی بدید و هم خروجی داشته باشید. به این مثال توجه کنید:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MsgBox(aaa("Salem"))
End Sub

Function aaa(ByVal text As String) As String
MsgBox(text)
Return ("ok")
End Function

baran_mehr
شنبه 10 اسفند 1387, 13:38 عصر
برای استفاده از تابع خودتون هم کافی در هنگام فراخونی، مقدار ورودی رو براش مشخص کنید.

arsalansalar
شنبه 10 اسفند 1387, 14:16 عصر
http://barnamenevis.org/forum/showthread.php?t=95225

anooshiran
شنبه 10 اسفند 1387, 17:04 عصر
سلام دوست عزيز

براي اين منظور شما همراه با Thread بايد از Delegate نيز استفاده كنيد. اين دو معمولا كارايي زيادي با يكديگر دارند. اگر در مورد مفهوم delegate مشكلي داشتيد بفرماييد تا عرض كنم.




Delegate Sub StartTextDelegate(ByVal text As String)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Arg As New Argument()
Arg.StartDelegate = AddressOf aaa
Dim tr1 As New Thread(AddressOf Arg.Startaaa)
tr1.Priority = ThreadPriority.Normal
tr1.Start()
tr1 = New System.Threading.Thread(AddressOf Arg.Startaaa)
tr1.Abort()
End Sub

Private Sub aaa(ByVal MyText As String)
MsgBox(MyText)
End Sub
Private Class Argument
Public text As String
Public StartDelegate As StartTextDelegate
Public Sub Startaaa()
text = "Helo roya_hh"
StartDelegate(text)
End Sub
End Class

roya_hh
یک شنبه 11 اسفند 1387, 08:13 صبح
اگه ممکنه یکمی هم در مورد delegate برام توضیح بدهید. اینکه چکاری انجام میدهد و در thread چه استفاده ای دارد. ممنون