PDA

View Full Version : حرفه ای: برنامه نویسی چند نخی!(اجرای چند دستور باهم،برنامه نویسی موازی)



AlgorithmX
دوشنبه 04 بهمن 1389, 11:58 صبح
سلام دوستان !
یکی از روش های برنامه نویسی که امروزه برای برنامه های پیشرفته از آن استفاده میشود(برنامه هایی با محاسبات زیاد) روش برنامه نویسی موازی یا چند نخی است. در این نوع برنامه نویسی شما میتوانید چندین خط از برنامه خود را باهم وارد پروسه پردازش کند ، مثلا خود سیستم عامل ویندوز (که بیشتر پوسته آن با زبان C نوشته شده) از این روش برای اعمال دستورات ما استفاده می کند به طوری که برنامه ما را تقسیم کرده و هر قسمت از آن را جداگانه وارد سیستم پردازش CPU می کند تا کار ها سریع تر به نتیجه برسند (مخصوصا در سیستم هایی که چند هسته ای هستند هر کار به گردن یک یا چند هسته واگزار می شود).

حال اگر ما در برنامه خود از روش موازی استفاده کنیم انجام این عمل را از گردن سیستم عامل وا می داریم.
امکان برنامه نویسی موازی در تمایی زبان های برنامه نویسی Visual Studio موجود است. اما این که چگونه این سبک را به کار بگیریم و از توابع آن استفاده کنیم رو نمیدونم!

کمی از توضیحات بالا برای کسانی بود که با این سبک آشنایی نداشتن اما درخاست کمک من از کسانی هست که این روش رو بلدند و در برنامه هاشون به کار برده اند یا با اون آشنایی دارند.

- توابع مهم این دستور چیست؟
- نحوه به کار گیری اونا چطوریه؟
- چطوری میشه چند سورس رو با هم اجرا کرد؟

هرچیکه فکر میکنید در این روش مهمه و به کار گرفته میشه اگر شد در بین دوستاتون هم تقسیم کنید.
ممنون میشم:قلب:

AlgorithmX
دوشنبه 04 بهمن 1389, 16:43 عصر
کمی تو سایت گشتم واین هارو پیدا کردم(البته به زبان VB نیستند!)
کسی چیزی فهمید بگه ممنون میشم....

http://barnamenevis.org/showthread.php?90928-ایجاد-ترد

http://www.barnamenevis.org/showthread.php?135552-اجرای-دو-پروسه-موازی

http://barnamenevis.org/showthread.php?88959-انجام-Multi-Taskingدر-کنسول؟

http://barnamenevis.org/showthread.php?215597-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%D9%8A%D8%B3%D9%8A-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%D9%8A

محسن شامحمدی
دوشنبه 04 بهمن 1389, 19:12 عصر
- توابع مهم این دستور چیست؟
- نحوه به کار گیری اونا چطوریه؟
- چطوری میشه چند سورس رو با هم اجرا کرد؟
الگوريتم جان سوالاتت كمي عجيب اند!
يعني همش شبيه همن
حالا من يكم توضيح مي دم.
البته كمي هم از اينجا (http://www.programmersheaven.com/2/Les_VBNET_14_p1)كمك مي گيرم(چرخ رو دوباره...)



كلاس مورد استفاده
system.threading.thread

طريقه ساخت يك 2 ترد و اجراي همزمان دو تابع مختلف توسط اون ها



Public Sub Main()
Dim firstThread As New Thread(New ThreadStart(AddressOf Fun1))
Dim secondThread As New Thread(New ThreadStart(AddressOf Fun2))
firstThread.Start()
secondThread.Start()
Console.WriteLine("End of Main()")
End Sub
Public Sub Fun1()
Dim i As Integer
For i = 1 To 5
Console.WriteLine("Fun1() writes: {0}", i)
Next
End Sub
Public Sub Fun2()
Dim i As Integer
For i = 10 To 6 Step -1
Console.WriteLine("Fun2() writes: {0}", i)
Next
End Sub

خب همه چيز روشنه
2 تا تابع داريم كه مي خوان همزمان اجرا بشن.
و خواهيد ديد كه مي شن.
پاورقي:برنامه بالا در محيط console application قابل اجراست.


هرچیکه فکر میکنید در این روش مهمه و به کار گرفته میشه اگر شد در بین دوستاتون هم تقسیم کنید.
راستش الان كه دانشگاهم و وقت امتحانات
ترم تموم بشه مي رم خونه يك مقاله كامل در مورد برنامه نويسي multi threading در وي بي نت مي نويسم.
اگر سوال ديگه اي هم مونده بگو.

AlgorithmX
دوشنبه 04 بهمن 1389, 23:02 عصر
سلام!

راستش الان كه دانشگاهم و وقت امتحانات

موفق باشی!:چشمک:
ممنونم از پاسختون آقا محسن:قلب:!!!


اگر سوال ديگه اي هم مونده بگو.
چرا باید تردهارو در کنسول اجرا کرد؟
چطوری باید کنسول ها به کار گرفت (دستوراتش رو اجرا کرد)؟
اگر هم در مورد کنسول ها و کارایشون توضیح بدید ممنون میشم!
حالا این دو حلقه (Fun1 و Fun2) در سورس بالا باهم اجرا میشه نه؟؟؟

پر روام نه!!!:خجالت:

alimanam
دوشنبه 04 بهمن 1389, 23:54 عصر
با سلام


چرا باید تردهارو در کنسول اجرا کرد؟

کسی نگفته فکر کنم سوء تفاهمی پیش اومده !!!

بهتره کمی بیشتر در مورد Multithreading در اینترنت سرچ کنین . همچنین از آبجکت BackgroundWorker که دقیقاً کار Thread رو انجام میده رو یه سرچی بزنین بد نیست نمونه کد و سورس های زیادی یافت میشه یکی از بهترین سورس ها در این زمینه واسه یادگیری چند نخی این سورس (http://www.codeproject.com/KB/vb/mutithreading_for_beginer.aspx)هستش . موفق باشید .

AlgorithmX
سه شنبه 05 بهمن 1389, 00:54 صبح
الگوريتم جان سوالاتت كمي عجيب اند!
يعني همش شبيه همن
حالا من يكم توضيح مي دم.
البته كمي هم از اينجا (http://www.programmersheaven.com/2/Les_VBNET_14_p1)كمك مي گيرم(چرخ رو دوباره...)



كلاس مورد استفاده
system.threading.thread

طريقه ساخت يك 2 ترد و اجراي همزمان دو تابع مختلف توسط اون ها



Public Sub Main()
Dim firstThread As New Thread(New ThreadStart(AddressOf Fun1))
Dim secondThread As New Thread(New ThreadStart(AddressOf Fun2))
firstThread.Start()
secondThread.Start()
Console.WriteLine("End of Main()")
End Sub
Public Sub Fun1()
Dim i As Integer
For i = 1 To 5
Console.WriteLine("Fun1() writes: {0}", i)
Next
End Sub
Public Sub Fun2()
Dim i As Integer
For i = 10 To 6 Step -1
Console.WriteLine("Fun2() writes: {0}", i)
Next
End Sub

خب همه چيز روشنه
2 تا تابع داريم كه مي خوان همزمان اجرا بشن.
و خواهيد ديد كه مي شن.
پاورقي:برنامه بالا در محيط console application قابل اجراست.


راستش الان كه دانشگاهم و وقت امتحانات
ترم تموم بشه مي رم خونه يك مقاله كامل در مورد برنامه نويسي multi threading در وي بي نت مي نويسم.
اگر سوال ديگه اي هم مونده بگو.

دیدی دوست خوبم!

AlgorithmX
سه شنبه 05 بهمن 1389, 01:13 صبح
حالا این دو دستور که با هم اجرا نمیشن ، اول fun2 بعد fun1

AlgorithmX
سه شنبه 05 بهمن 1389, 01:34 صبح
میشه در مورد این سورس که تو سایتی که آقا alimanam فرمودندکمی توضیح بدید؟؟؟



 
'The main mother class in .NET Framework to work with threading.
Imports System.Threading
'Creating Thread
Dim objThreadClass As New clsThread(2, Me)
Dim objNewThread As New Thread(AddressOf objThreadClass.StartThread)
objNewThread.IsBackground = True
objNewThread.Start()
m_ThreadList.Item(1) = objNewThread
'Receiving Message from thread
Public Sub ReceiveThreadMessage(ByVal ThreadIndex As Integer, _
ByVal Counter As Integer)
'do your work here depending on the return variables from the thread.
End Sub
 
'Sending Message from thread to the main application.
'First create a delegate (For details plz see the comments inside the codes)
Private Delegate Sub NotifyMainWindow(ByVal ThreadIndex As Integer, _
ByVal Counter As Integer)
'We need an object of this deletegate
Private m_NotifyMainWindow As NotifyMainWindow
'Assign the pointer to the method of the main window to the delegate
m_NotifyMainWindow = AddressOf MainWindow.ReceiveThreadMessage
'Create Argument List
ReDim m_Args(1)
m_Args(0) = m_ThreadIndex
m_Args(1) = m_Counter
'Call the notificaiton method on the main window by the delegate
m_MainWindow.Invoke(m_NotifyMainWindow, m_Args)

AlgorithmX
چهارشنبه 06 بهمن 1389, 14:43 عصر
میشه در مورد این سورس که تو سایتی که آقا alimanam فرمودندکمی توضیح بدید؟؟؟


کسی توضیحی نداشت!!



این تایپیک (http://barnamenevis.org/showthread.php?269813-مشکل-در-اجرای-همزمان-thread-ها)هم از ..091 که در این رابطه هست و به نتایج خوبی هم دست یافته

reza_edu
پنج شنبه 07 بهمن 1389, 08:04 صبح
[DOWNLOAD]سلام منون از دوست گرامی 09111111111 که این مثال جالب رو گذاشت خیلی کاربردی بود تازه مفهوم رو فهمیدم فقط دوستان برای اینکه نتیجه کد رو ببینید این تیکه ای که با رنگ قرمز توشته شده هست رو به کد بالا اضافه کنید و دو یا سه بار برنامه رو اجراکنید و ببندید (البته به صفحه نگاه کنید و کد هارو بخونید) چه جالب هربار نشون میده که ترتیب اجرا به چه صورت هست این کد خیلی واضحه دوزاری من رو انتداخت 09111111111 دمت گرمحال دادی.


Public Sub Main()
Dim firstThread As New Thread(New ThreadStart(AddressOf Fun1))
Dim secondThread As New Thread(New ThreadStart(AddressOf Fun2))
firstThread.Start()
secondThread.Start()
Console.WriteLine("End of Main()")
Dim line As String
line = Console.ReadLine()
End Sub
Public Sub Fun1()
Dim i As Integer
For i = 1 To 5
Console.WriteLine("Fun1() writes: {0}", i)
Next
End Sub
Public Sub Fun2()
Dim i As Integer
For i = 10 To 6 Step -1
Console.WriteLine("Fun2() writes: {0}", i)
Next
End Sub
اما یه سوال داشتم من خواستم از این روش استفاده کنم که به مشکل برخوردم اول شرایط برنامه رو توضیح میدم بعد میگم چه مشکلی پیش اومد
برنامه من شامل چند فرم هست(3 تا) فرم اول لاگین به برنامه هست و فرم دوم صفحه اصلی هست که از 5 تب پیج تشکیل شده و هر تب پیج با چند پنل به قسمت های مختلف توی هر پنل کمبو باکس های مختلفی هست که با هر بار لاگین کردن به برنامه باید اطلاعات این کمبو باکس ها از دیتابیس خونده بشه وداخل کمبوباکس ها ریخته بشه قبل از هر بار اجرای برنامه این اعمال تو فرم لود برنامه انجام میشه:
1.تمامی پنل های هر تب پیج مقدار ویزیبل آنها برابر فالس میشه(البته دوستا نگن که موقه ساخت برنامه فالس کن نیاز به این کار دیگه نیست ! این کار دلیل داره از فایل خونده میشه شرایط شون بستگی به آخرین بار کارکرد منشی داره)
2. اطلاعات از دیتابیس خونده میشه و تو کمبوباکس ها ریخته میشه حدودا 40 تا کمبوباکس هست.

خوب این شرایط باعث شده تا زمان اجرای برنامه حسابی طول بکشه چیزی حدود 5 دیقه طول میکشه تا فرم ظاهر بشه من با خوندن این مسئله بفکرم زد که تو فرو لاگین اولیه توابع رو فراخونی کنم همون روش secondThread.Start() که دیدم خطا میگیره اومدم تو همون فرم لود برنامه بنویسم که دیدم یه بار تو زمان ویزیبل کردن قاتی کرد چندین بارم تو کانکشن یعنی چی ! خوب من تو یه جا کانکشن رو بستم یه دفه میپره میره یه قسمت دیگه برنامه رو انجام بده که کانکشن باز رو احتیاج داره ؟ این چه جوریه دیگه فایده نداره که چند بار با f11 تست کردم دیدم که گیر میده چی کار کنم به نظر شما؟

محسن شامحمدی
پنج شنبه 07 بهمن 1389, 19:59 عصر
ببخشید الگوریتم جان یک چند روزی سر امتحانات بودم نتونستم بیام جواب بدم.:خجالت:

چرا باید تردهارو در کنسول اجرا کرد؟
نه الگوریتم جان
اینطور نیست.
منظور من این بود که کدی که من این بالا گذاشتم فقط در کنسول کار می کنه نه در ویندوز فرم.دلیلش هم برمی گرده به استفاده از کلاس console


چطوری باید کنسول ها به کار گرفت (دستوراتش رو اجرا کرد)؟
متاسفم بنده هنوز فلسفه پشتیبانی دات نت از محیط کنسول رو نفهمیدم.
ولی فکر کنم چون کدنویسیش خیلی سادست و به راحتی می شه برنامه نویسی رو توش یاد گرفت حذف نمی شه.



میشه در مورد این سورس که تو سایتی که آقا alimanam فرمودندکمی توضیح بدید؟؟؟
کل کارش اینه که با استفاده از یک ترد به ترد اصلی یک سری مقدار می فرسته و تابعی در ترد ساخته شد اجرا می شه.


(http://barnamenevis.org/showthread.php?269813-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-thread-%D9%87%D8%A7)این تایپیک (http://barnamenevis.org/showthread.php?269813-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-thread-%D9%87%D8%A7)هم از ..091 که در این رابطه هست و به نتایج خوبی هم دست یافته
دست رو دلم نذار که دلم خونه الگوریتم جان.
من فکر می کردم این همه برنامه نویس حداقل یکیشون بدونه چطوری می شه همزمان سازی(synchronization) رو واسه تردم انجام بدم ولی دیدم که کسی نمی دونه.
الان هم دارم راه های همزمان سازی تردها رو می خونم (http://msdn.microsoft.com/en-us/library/ms173179.aspx) تا ببینم اگر چیزی یاد گرفتم بیام و مشکلمو خودم حل کنم(توضیحشم شاید گذاشتم)



این کد خیلی واضحه دوزاری من رو انتداخت 09111111111 دمت گرمحال دادی.
قابلی نداشت.:بامزه:


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


خوب من تو یه جا کانکشن رو بستم یه دفه میپره میره یه قسمت دیگه برنامه رو انجام بده که کانکشن باز رو احتیاج داره ؟ این چه جوریه دیگه فایده نداره
:قهقهه::قهقهه::قهقهه:
حرف شما درسته.
ولی برای حل این مشکل باید واسه پر کردن هر تردتون یک کانکشن جدا داشته باشین.
یعنی اگر قراره که 3 تا ترد عملیات پر کردن کمبو باکس رو انجام بدن هر کردومشون باید یک کانکشن اختصاصی به بانک داشته باشن:کف:
اینطوری دیگه اگر همزمان هر3 تا ترد هم مشغول پر کردن محیط برنامه بشن بازم هیچ مشکلی نداره چون هیچکدوم پاشون رو از گلیم خودشون درازتر نمی کنه!

دوستان بنده همچنان در خدمتم.

AlgorithmX
جمعه 08 بهمن 1389, 01:55 صبح
ممنونم عزت که پیگیری میکنی ..091 عزیز!:قلب:
امیدوارم بالاخره یکی پیدا بشه که بتونه به تمامی سوالات ما رو توی تردها جواب بده !|!-:ناراحت:-!|!

reza_edu
جمعه 08 بهمن 1389, 02:01 صبح
سلام ممنون از alimanam جناب که سورسی رو معرفی کردن اما این برنامه وقتی یکم باهاش بازی کنی مشکل پیدا میکنه شما اگه آروم دونه دونه استارت رو بزنی مشکل نداره اما اگه بدون ترتیب وسریع هی استارت کنی و استوپ برنامه قاتی میکنه چرا؟ اما بازم دمت گرم که گفتی :لبخند:
آقا مشکل ما حل نشد کانکشن هم جواب نداد اصلا از برنامه پرت میشه میره یه جای دیگه تو برنامه از تابع خارج میشه درحالیکه من اصلا دستوری برای این کار ننوشتم؟

AlgorithmX
جمعه 08 بهمن 1389, 02:12 صبح
میشه در مورد این سورس که تو سایتی که آقا alimanam فرمودندکمی توضیح بدید؟؟؟



 
'The main mother class in .NET Framework to work with threading.
Imports System.Threading
'Creating Thread
Dim objThreadClass As New clsThread(2, Me)
Dim objNewThread As New Thread(AddressOf objThreadClass.StartThread)
objNewThread.IsBackground = True
objNewThread.Start()
m_ThreadList.Item(1) = objNewThread
'Receiving Message from thread
Public Sub ReceiveThreadMessage(ByVal ThreadIndex As Integer, _
ByVal Counter As Integer)
'do your work here depending on the return variables from the thread.
End Sub
 
'Sending Message from thread to the main application.
'First create a delegate (For details plz see the comments inside the codes)
Private Delegate Sub NotifyMainWindow(ByVal ThreadIndex As Integer, _
ByVal Counter As Integer)
'We need an object of this deletegate
Private m_NotifyMainWindow As NotifyMainWindow
'Assign the pointer to the method of the main window to the delegate
m_NotifyMainWindow = AddressOf MainWindow.ReceiveThreadMessage
'Create Argument List
ReDim m_Args(1)
m_Args(0) = m_ThreadIndex
m_Args(1) = m_Counter
'Call the notificaiton method on the main window by the delegate
m_MainWindow.Invoke(m_NotifyMainWindow, m_Args)




بازم کسی نبود این سورس رو ترجمه کنه و مشکلشو رفع !!!!:گریه:

reza_edu
جمعه 08 بهمن 1389, 02:26 صبح
خوب کدش واضح هست کجاش رو مشکل داری بگو تا بشه کمک کرد منم اولین بار این کد رو دیدم اما کد بحد کافی وازح هست بگو تا اونجا که خودم فهمیدم میگم چی به چیه

AlgorithmX
جمعه 08 بهمن 1389, 02:45 صبح
خدا رو شکر ، یکی ما رو پیدا کرد!!!


چرا در VS 2010 به اون سورس هایی که زیرشون خط داره گیر میده؟؟


 

Imports System.Threading

Dim objThreadClass AsNew clsThread(2, Me)
Dim objNewThread AsNewThread(AddressOf objThreadClass.StartThread)
objNewThread.IsBackground = True
objNewThread.Start()
m_ThreadList.Item(1) = objNewThread

PublicSub ReceiveThreadMessage(ByVal ThreadIndex AsInteger,ByVal Counter AsInteger)
اینجا چی باید نوشت
EndSub
 
کار خط پایین چیه؟؟
PrivateDelegateSubNotifyMainWindow(ByVal ThreadIndex AsInteger,ByVal Counter AsInteger)


Private m_NotifyMainWindow As NotifyMainWindow

m_NotifyMainWindow = AddressOf MainWindow.ReceiveThreadMessage
دستور زیر چه کار میکنه؟؟
ReDim m_Args(1)
m_Args(0) = m_ThreadIndex
m_Args(1) = m_Counter

m_MainWindow.Invoke(m_NotifyMainWindow, m_Args)



و در کل دو دستوری که قراره با هم اجراشن رو کجا باید نوشت؟؟

b.mahsa
جمعه 08 بهمن 1389, 03:06 صبح
برای اجرای همزمان . شما میتونیئ از backgroundworker یا thread استفاده کنید.
تو این پست جناب موسوی یه مثال واضح و خوب برای استفاده از backgroundworker زدن.



http://barnamenevis.org/showthread.php?197197-%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-BackgroundWorker-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%D8%B3%D8%A7%D8%B2%DB%8C

reza_edu
جمعه 08 بهمن 1389, 03:08 صبح
Dim objNewThread AsNewThread(AddressOf objThreadClass.StartThread)
اون قسمت قرمز رو فقط اسم تابع یا کلاس رو بنویس مشکلت حل میشه بگو هستم

sibooy
دوشنبه 11 شهریور 1392, 15:30 عصر
در این پست هم روش نصب CUDA هم یک مثال از اون رو گذاشتم(برای برنامه نویسی موازی بر روی پردازنده های گرافیکی). هم برنامه نویسی موازی روی پردازنده های چندهسته ای با openMP رو با یک مثال گذاشتم.
http://barnamenevis.org/showthread.php?414780-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%85%D9%88%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-C-%D8%A8%D8%A7-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%87%D8%B3%D8%AA%D9%87-%D8%A7%DB%8C%D8%8C-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%AF%D8%B1%D8%A7%D9%81%DB%8C%DA%A9-%D9%88-%DA%86%D9%86%D8%AF-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%A7%DB%8C
دوستان اگر نکته ای آموزشی چیزی در مورد برنامه نویسی موازی با پردازنده های چند هسته ای پردازنده های گرافیکی و چند پردازنده ای بلدید همونجا بذارید.
روش کار با MPI ها جاش اونجا خالیه. اگه کسی آموزشی در اون مورد داره اونجا بذاره تا خلایق استفاده کنن.