PDA

View Full Version : اجرای دو فرمان بصورت همزمان در یک ثانیه



csharpprogramer88
جمعه 11 مهر 1393, 16:49 عصر
سلام

دوستان گرامی ، اگر ما بخواهیم دو فرمان را بصورت همزمان در یک ثانیه اجرا کنیم چطوری باید اینکار را بگنیم ؟

آیا به این نوع کار ها ترید گفته میشه/.؟

meysamsh91
شنبه 12 مهر 1393, 01:47 صبح
سلام
بله با تکنیک Thread میشه این کار رو انجام داد اما در ظاهر به نظر میاد که همزمان دارن اجرا میشن برای درک بهتر موضوع یکم در مورد عملکرد CPU میگم تا کاملا متوجه این تکنیک بشید
ببینید CPU دارای یک ساعت الکترونیکی هست که می تونه در یک ثانیه تعدادی فرکانس تولید کنه و مطابق این فرکانس ها پردازش صورت میگیره.
تمامی دستورالعمل هایی که به cpu ارسال میشه (اعم از فشرده شدن یک کلید یا اجرا شدن یک متد و ...) به عنوان یک وقفه یا interrupt در یک صف قرار می گیرن تا اجرا بشن ، تقدم و تاخر اجرای اونها رو هم قسمت CU بر اساس فرکانس های تولید شده تعیین می کنه.
متد هایی که بصورت معمول به عنوان وقفه به CPU ارسال میشه به صورت سریال اجرا میشن یعنی پشت سر هم. در صورتیکه تکنیک Thread که شما هم اشاره کردید به ما این امکان رو می ده که 2 متد را به موازات هم اجرا کنیم و به این عمل Time Sharing میگیم و چون سرعت اجرای موازی متدها بسیار زیاد هست کاربر تشخیص قطع برنامه رو نمی ده به خاطر همین در اصطلاح میگیم که چند متد همزمان دارن اجرا میشن.
موارد استفاده از این تکنیک هم خیلی زیاده و اکثر برنامه نویس های حرفه ای تو برنامه هاشون از این تکنیک استفاده می کنن.

اگر باز هم نیاز به راهنمایی بیشتر داشتید بگید تا براتون چند تا مثال بزنم .

csharpprogramer88
شنبه 12 مهر 1393, 10:35 صبح
سلام
بله با تکنیک Thread میشه این کار رو انجام داد اما در ظاهر به نظر میاد که همزمان دارن اجرا میشن برای درک بهتر موضوع یکم در مورد عملکرد CPU میگم تا کاملا متوجه این تکنیک بشید
ببینید CPU دارای یک ساعت الکترونیکی هست که می تونه در یک ثانیه تعدادی فرکانس تولید کنه و مطابق این فرکانس ها پردازش صورت میگیره.
تمامی دستورالعمل هایی که به cpu ارسال میشه (اعم از فشرده شدن یک کلید یا اجرا شدن یک متد و ...) به عنوان یک وقفه یا interrupt در یک صف قرار می گیرن تا اجرا بشن ، تقدم و تاخر اجرای اونها رو هم قسمت CU بر اساس فرکانس های تولید شده تعیین می کنه.
متد هایی که بصورت معمول به عنوان وقفه به CPU ارسال میشه به صورت سریال اجرا میشن یعنی پشت سر هم. در صورتیکه تکنیک Thread که شما هم اشاره کردید به ما این امکان رو می ده که 2 متد را به موازات هم اجرا کنیم و به این عمل Time Sharing میگیم و چون سرعت اجرای موازی متدها بسیار زیاد هست کاربر تشخیص قطع برنامه رو نمی ده به خاطر همین در اصطلاح میگیم که چند متد همزمان دارن اجرا میشن.
موارد استفاده از این تکنیک هم خیلی زیاده و اکثر برنامه نویس های حرفه ای تو برنامه هاشون از این تکنیک استفاده می کنن.

اگر باز هم نیاز به راهنمایی بیشتر داشتید بگید تا براتون چند تا مثال بزنم .

میشه ی مثال کاربردی بزنین یک مثال که برنامه نویسان حرفه ای از اون زیاد استفاده میکنن

elec60
شنبه 12 مهر 1393, 13:30 عصر
http://www.albahari.com/threading/

Mousavmousab
شنبه 12 مهر 1393, 15:56 عصر
برو این همه مثال های آماده از Thread را ببین ،

توی گوگل سرچ کن : آموزش استفاده از Thread در سی شارپ
موفق باشی

meysamsh91
شنبه 12 مهر 1393, 18:48 عصر
میشه ی مثال کاربردی بزنین یک مثال که برنامه نویسان حرفه ای از اون زیاد استفاده میکنن

مثلا تو ویندوز دارید یک فولدر رو کپی میکنید و همزمان با اون که داره کپی مشه شما نیاز دارید از یک فایل متنی پرینت بگیرید.

csharpprogramer88
شنبه 12 مهر 1393, 19:00 عصر
مثلا تو ویندوز دارید یک فولدر رو کپی میکنید و همزمان با اون که داره کپی مشه شما نیاز دارید از یک فایل متنی پرینت بگیرید.

یعنی مسایل این دستی را باید با ترید مدیریت کنیم؟ یا روش دیگری هم داریم؟

meysamsh91
شنبه 12 مهر 1393, 19:18 عصر
از این تکنیک برای مدیریت بهینه منابع استفاده میشه حالا مونده به نیاز شما. اما بهترین روش همین Threadو Multi Thread هست.

یک مثال الان تو سی شارپ برات آماده کردم تو محیط ویندوز فرم. من با ترد اجرا میکنم و شما خودتون بدون ترد این کار رو هم انجام بدید تا کاملا ملموس بشه موضوع.

مثال : 2 تا متد داریم به نام F1 و F2
وظیفه متد F1 : ترسیم 500 خط از مرکز فرم به نقاط تصادفی
وظیفه متد F2: ترسیم 500 مربع که مرکز مربع ها مرکز فرم و طول و عرض تصادفی دارن.
یک دکمه هم داریم به نام Start که قراره این 2 متد رو به صورت موازی اجرا کنه.


using System.Threading;


تعریف متد ها

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Random r = new Random();
private void f1()
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Red, 2);
for (int i = 1; i <= 500; i++)
g.DrawLine(p, this.Width / 2, this.Height / 2, r.Next(this.Width), r.Next(this.Height));
}
private void f2()
{
int w = this.Width / 2;
int h = this.Height / 2;
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Blue, 1);
for (int i = 1; i <= 500; i++)
{
int rand = Convert.ToInt32(r.Next(this.Height));
g.DrawRectangle(p, w - rand / 2, h - rand / 2, rand, rand);
}
}

رویداد کلیک دکمه Start


private void cmdStart_Click(object sender, EventArgs e)
{
ThreadStart ts1 = new ThreadStart(f1);
ThreadStart ts2 = new ThreadStart(f2);
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.Start();
t2.Start();
}