PDA

View Full Version : اجرای همزمان چند دستور



omid-vbAuto
سه شنبه 21 دی 1389, 15:19 عصر
دوستان سلام

اولا من تو سایت جستجو کردم و چیزی که به درد من بخوره پیدا نکردم.


من می خوام 3 تا دستور به طور همزمان با هم اجرا بشن.فکر کنم با Thread بشه ولی یه الگوریتم و نمونه برنامه ی کاربردی دم دستم نبود.

بطور مثال می خوام با زدن یه دکمه 3 تا کار به طور همزمان انجام بشن:

1- ریچ باکس شروع به پر شدن میشه(البته فرآیند زمانبری هست چون فایل Txt بزرگی داره)
2- یه عکس تو پیکچر باکس نمایش داده بشه.
3- دیتاگرید ویو شروع به پر شدن بشه.


البته نمی خوام دقیقا پروژه بالا رو اجرا کنم.اما یه مثال بود تا منظورمو برسونم.و همون طور که می دونید اگه بدون Thread انجام بشه نوبتی انجام میشه یعنی اول ریچ باکس بعد عکسه و یعدش دیتا بیس.

که من می خوام منتظر هم نباشن. و بطور مستقل شروع به کار کنن.


با تشکر

salehbagheri
سه شنبه 21 دی 1389, 15:45 عصر
گزینه راحت تر برای شما استفاده از Application.DoEvents() هست!

راه بعدی استفاده از Thread ها هست!

کافیه شما عملیاتهای مورد نظر خودتون رو در سابروتین های جداگانه وارد کنید و سپس در هنگام اجرای برنامه، آن را با استفاده از Thread ها اجرا کنید.


Imports System
Imports System.Threading
' Simple threading scenario: Start a Shared method running
' on a second thread.
Public Class ThreadExample
' The ThreadProc method is called when the thread starts.
' It loops ten times, writing to the console and yielding
' the rest of its time slice each time, and then ends.
Public Shared Sub ThreadProc()
Dim i As Integer
For i = 0 To 9
Console.WriteLine("ThreadProc: {0}", i)
' Yield the rest of the time slice.
Thread.Sleep(0)
Next
End Sub
Public Shared Sub Main()
Console.WriteLine("Main thread: Start a second thread.")
' The constructor for the Thread class requires a ThreadStart
' delegate. The Visual Basic AddressOf operator creates this
' delegate for you.
Dim t As New Thread(AddressOf ThreadProc)
' Start ThreadProc. Note that on a uniprocessor, the new
' thread does not get any processor time until the main thread
' is preempted or yields. Uncomment the Thread.Sleep that
' follows t.Start() to see the difference.
t.Start()
'Thread.Sleep(0)
Dim i As Integer
For i = 1 To 4
Console.WriteLine("Main thread: Do some work.")
Thread.Sleep(0)
Next
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")
t.Join()
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.")
Console.ReadLine()
End Sub
End Class



متاسفانه در اینجا قابل فهم نیست، در لینک زیر بهتر متوجه میشوید.
http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

omid-vbAuto
سه شنبه 21 دی 1389, 16:14 عصر
گزینه راحت تر برای شما استفاده از Application.DoEvents() هست!

راه بعدی استفاده از Thread ها هست!

کافیه شما عملیاتهای مورد نظر خودتون رو در سابروتین های جداگانه وارد کنید و سپس در هنگام اجرای برنامه، آن را با استفاده از Thread ها اجرا کنید.


Imports System
Imports System.Threading
' Simple threading scenario: Start a Shared method running
' on a second thread.
Public Class ThreadExample
' The ThreadProc method is called when the thread starts.
' It loops ten times, writing to the console and yielding
' the rest of its time slice each time, and then ends.
Public Shared Sub ThreadProc()
Dim i As Integer
For i = 0 To 9
Console.WriteLine("ThreadProc: {0}", i)
' Yield the rest of the time slice.
Thread.Sleep(0)
Next
End Sub
Public Shared Sub Main()
Console.WriteLine("Main thread: Start a second thread.")
' The constructor for the Thread class requires a ThreadStart
' delegate. The Visual Basic AddressOf operator creates this
' delegate for you.
Dim t As New Thread(AddressOf ThreadProc)
' Start ThreadProc. Note that on a uniprocessor, the new
' thread does not get any processor time until the main thread
' is preempted or yields. Uncomment the Thread.Sleep that
' follows t.Start() to see the difference.
t.Start()
'Thread.Sleep(0)
Dim i As Integer
For i = 1 To 4
Console.WriteLine("Main thread: Do some work.")
Thread.Sleep(0)
Next
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")
t.Join()
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.")
Console.ReadLine()
End Sub
End Class



متاسفانه در اینجا قابل فهم نیست، در لینک زیر بهتر متوجه میشوید.
http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx

مهندس باقری ازتون ممنونم.ولی این مطالب راهگشا نبودن.

من می خوام دستوراتمو تبدیل به 3 تا Thread مختلف بکنم.همین.

در ضمن Application.DoEvents بیشتر در حلقه کارائی داره.ولی من تو یه IF می خوام از Thread استفاده کنم.

خواسته من از شما اینه که برامون 3 تا Thread تعریف کنید که دستوراتش کاراهائی هست که تو پست اول گفتم.


با تشکر

salehbagheri
چهارشنبه 22 دی 1389, 14:00 عصر
ابتدا سه متد زیر رو تعریف کرده:


Public Shared Sub Load_TextBox()
'TODO
End Sub
Public Shared Sub Show_Picture()
'TODO
End Sub
Public Shared Sub Fill_GridView()
'TODO
End Sub


و سپس در Form Load برای هر یک از متدهای بالا، همچون کد زیر، یک Thread ایجاد کنید و بعد آن را اجرا کنید.



Dim LTextBoxThread As New System.Threading.Thread(AddressOf Load_TextBox)
LTextBoxThread.Start()



متدهای Load_TextBox و Show_Picture و Fill_GridView به ترتیب وظایف زیر را بر عهده دارند.

1- ریچ باکس شروع به پر شدن میشه(البته فرآیند زمانبری هست چون فایل Txt بزرگی داره)
2- یه عکس تو پیکچر باکس نمایش داده بشه.
3- دیتاگرید ویو شروع به پر شدن بشه.

omid-vbAuto
چهارشنبه 22 دی 1389, 14:31 عصر
ابتدا سه متد زیر رو تعریف کرده:


Public Shared Sub Load_TextBox()
'TODO
End Sub
Public Shared Sub Show_Picture()
'TODO
End Sub
Public Shared Sub Fill_GridView()
'TODO
End Sub


و سپس در Form Load برای هر یک از متدهای بالا، همچون کد زیر، یک Thread ایجاد کنید و بعد آن را اجرا کنید.



Dim LTextBoxThread As New System.Threading.Thread(AddressOf Load_TextBox)
LTextBoxThread.Start()



متدهای Load_TextBox و Show_Picture و Fill_GridView به ترتیب وظایف زیر را بر عهده دارند.


مهندس من وقتی می خوام به جای عبارت 'TODO کدهائی نظیر Textbox1.text="222" رو بنویسم ایراد میگره!!!!چرا؟؟؟




Public Shared Sub Load_TextBox()
'TODO
End Sub

omid-vbAuto
پنج شنبه 23 دی 1389, 10:13 صبح
اخیرا اعضاء سایت خیلی کم لطف شدن . فقط میان یه حکایت میگنو میرن!!!

لطفا دوستانی که در این زمینه اطلاعاتی دارن کمک کنن چیزی ازشون کم نمیشه.

دوستانی هم که اطلاعاتی در این مورد ندارن و می خوان اطلاعاتی کسب کنن ، لطفا حداقل بیان پیام های Off بذارن تا تاپیک پایین نره.

خلاصه الان وضیعت سایت خوب نیست. اکثرا بیشتر تاپیکها بی پاسخ هستن!!!!

hossein-khoshseyar
پنج شنبه 23 دی 1389, 13:29 عصر
دوست عزیز این پاسخی که دوستان دادن کاملا درسته
یه فرصت کوتاه بدی
من الان یه پروژه کوچیک برات اماده می کنم و میزارم همین جا
فعلا

hossein-khoshseyar
پنج شنبه 23 دی 1389, 13:54 عصر
سلام مجدد
این هم یک نمونه برنامه که همون کاری که شما می خوای رو انجام میده
اجرای همزمان سه کار

omid-vbAuto
پنج شنبه 23 دی 1389, 14:50 عصر
سلام مجدد
این هم یک نمونه برنامه که همون کاری که شما می خوای رو انجام میده
اجرای همزمان سه کار


مهندس دستت درد نکنه.

فکر کنم افراد زیادی به این کد نیاز داشتن.که شما لطف کردین.

منظور از کد زیر چیه که بکار بردین؟



CheckForIllegalCrossThreadCalls = False

hossein-khoshseyar
پنج شنبه 23 دی 1389, 15:00 عصر
در حالت عادی اگه شما این کد رو ننویسین
وقتی که از داخل روتین ترد بخواین به کنترلی از روی فرم دسترسی داشته باشید
مثلا متن تکست باکسی رو عوض کنید.....
کامپایلر از شما خطا میگیره و میگه که کنترل فرم دست یک ترد دیگه است و شما دارید از داخل یک ترد دیگه کنترل های یک ترد دیگه ای رو دست کاری می کنید
اما با نوشتن این دستور بالا شما از کامپایلر می خواید که چک نکنه که شما به چه تردهایی دست می زنید
یعنی اجاره دست کاری و نفوذ به داخل تردهای دیگه به شما داده بشه

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

omid-vbAuto
پنج شنبه 23 دی 1389, 17:39 عصر
در حالت عادی اگه شما این کد رو ننویسین
وقتی که از داخل روتین ترد بخواین به کنترلی از روی فرم دسترسی داشته باشید
مثلا متن تکست باکسی رو عوض کنید.....
کامپایلر از شما خطا میگیره و میگه که کنترل فرم دست یک ترد دیگه است و شما دارید از داخل یک ترد دیگه کنترل های یک ترد دیگه ای رو دست کاری می کنید
اما با نوشتن این دستور بالا شما از کامپایلر می خواید که چک نکنه که شما به چه تردهایی دست می زنید
یعنی اجاره دست کاری و نفوذ به داخل تردهای دیگه به شما داده بشه

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

از توضیحاتتون ممنونم.

اگه از قطعه کد یاد شده استفاده کنیم انهم غیر اصولی چه مشکلاتی رو سبب میشه؟؟؟

در ضمن آیا استفاده از این قطعه کد درصد هک شدن برناممون رو بالاتر میبره؟؟؟

hossein-khoshseyar
پنج شنبه 23 دی 1389, 21:33 عصر
از توضیحاتتون ممنونم.

اگه از قطعه کد یاد شده استفاده کنیم انهم غیر اصولی چه مشکلاتی رو سبب میشه؟؟؟

در ضمن آیا استفاده از این قطعه کد درصد هک شدن برناممون رو بالاتر میبره؟؟؟

فکر نکنم به هک شدن ربطی داشته باشه. یا حداقل من تو توضیحاتم چنین منظوری نداشتم

اصولیش این هست که ( من به زودی یه مقاله خوب تو این زمینه اینجا میزارم) اما الان فقط با یک مثال بیان کنم
مثل فرض کنیم که توی برنامه ما یک متغیر از دوتا جا که با هم موازی هستند و هرکدوم توی یک ترد دارن کار می کنن بخواد مقدار بگیره ؟ این یعنی چی؟
این یه خطای زمان اجراست که پیدا کردنش خیلی سخته
نوشتن کد اصولی یعنی اینکه هر ترد متغیرهای خاص خودش رو داشته باشه و با یک سری متغیرهای عمومی بتونه با بقیه ترد ها ارتباط داشته باشه
مثال خیلی بارزش استفاده از سریال خود VS هست
کسایی که از این پورت سریال استفاده کرده باشند به احتمال زیاد با این مشکلی که می گم برخورد کردن
این پورت سریال یک رویداد داره به نام دریافت دیتا
یعنی هر موقه اگه دیتایی دریافت شد این روتین اجرا میشه
خیلی ها میان و توی اون روتین کد مینویسن که دیتای دریافتی رو بیان توی یک تکست باکس نشون بدن
اما کامپایلر خطا میگیره
چون ابزار سریال یک ترد جداست
و فرم هم یک ترد جدا
و ما نمی تونیم (یا نباید ) از توی توی ترد سریال به تکست باکس فرم که مال ترد فرم دسترسی داشته باشیم و توش بنویسیم
توی همچین برنامه ساده ای شاید نوشتن اون دستور 2 تا پست قبل مشکل ما رو حل کنه و دیتای دریافتی بدون مشکلی توی تکست باکس نوشته بشه
اما اگه برنامه پیچیده تر باشه و اگه ترد دیگه بخواد تو همون لحظه یه چیزی توی تکست باکس بنویسه چی؟......

یه راه حل معمول برای این کار این هست که توی ترد سریال هر دیتایی که دریافت میشه توی یک متغیر عمومی گذاشته بشه
و توی فرم هم یک تایمر بزاریم که مثلا هر 100 میلی ثانیه دیتای اون متغیر عمومی رو توی تکست باکس نشون بده
این طوری ما از تداخل ترد ها یعنی نیاز به دستکاری اجزا ترد دیگه بی نیاز میشیم

این یک مثال ساده بود
در طی چند روز آینده یک مقاله خوب در این زمینه قرار می دم

omid-vbAuto
پنج شنبه 23 دی 1389, 22:03 عصر
فکر نکنم به هک شدن ربطی داشته باشه. یا حداقل من تو توضیحاتم چنین منظوری نداشتم

اصولیش این هست که ( من به زودی یه مقاله خوب تو این زمینه اینجا میزارم) اما الان فقط با یک مثال بیان کنم
مثل فرض کنیم که توی برنامه ما یک متغیر از دوتا جا که با هم موازی هستند و هرکدوم توی یک ترد دارن کار می کنن بخواد مقدار بگیره ؟ این یعنی چی؟
این یه خطای زمان اجراست که پیدا کردنش خیلی سخته
نوشتن کد اصولی یعنی اینکه هر ترد متغیرهای خاص خودش رو داشته باشه و با یک سری متغیرهای عمومی بتونه با بقیه ترد ها ارتباط داشته باشه
مثال خیلی بارزش استفاده از سریال خود VS هست
کسایی که از این پورت سریال استفاده کرده باشند به احتمال زیاد با این مشکلی که می گم برخورد کردن
این پورت سریال یک رویداد داره به نام دریافت دیتا
یعنی هر موقه اگه دیتایی دریافت شد این روتین اجرا میشه
خیلی ها میان و توی اون روتین کد مینویسن که دیتای دریافتی رو بیان توی یک تکست باکس نشون بدن
اما کامپایلر خطا میگیره
چون ابزار سریال یک ترد جداست
و فرم هم یک ترد جدا
و ما نمی تونیم (یا نباید ) از توی توی ترد سریال به تکست باکس فرم که مال ترد فرم دسترسی داشته باشیم و توش بنویسیم
توی همچین برنامه ساده ای شاید نوشتن اون دستور 2 تا پست قبل مشکل ما رو حل کنه و دیتای دریافتی بدون مشکلی توی تکست باکس نوشته بشه
اما اگه برنامه پیچیده تر باشه و اگه ترد دیگه بخواد تو همون لحظه یه چیزی توی تکست باکس بنویسه چی؟......

یه راه حل معمول برای این کار این هست که توی ترد سریال هر دیتایی که دریافت میشه توی یک متغیر عمومی گذاشته بشه
و توی فرم هم یک تایمر بزاریم که مثلا هر 100 میلی ثانیه دیتای اون متغیر عمومی رو توی تکست باکس نشون بده
این طوری ما از تداخل ترد ها یعنی نیاز به دستکاری اجزا ترد دیگه بی نیاز میشیم

این یک مثال ساده بود
در طی چند روز آینده یک مقاله خوب در این زمینه قرار می دم

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