PDA

View Full Version : طریقه نوشتن یک الگوریتم متوالی



smt1383
دوشنبه 05 اردیبهشت 1390, 09:01 صبح
با سلام خدمت دوستان
در یک برنامه ما چند متغیر داریم که در یک Thread جداگانه مرتب مقدارشان تغییر می کند. حال می خواهیم در برنامه یک کلاس تعریف کنیم که یک الگوریتمی را به شکل زیر پیاده سازی کند:
مثلاً ابتدا متغیر a را دائماً چک کند هر گاه این متغیر مقدار مشخصی گرفت آنگاه به مرحله بعد می رود. در این مرحله مثلاً 4 متغیر b1 تا b4 را دائماً چک می کند. هرگاه این 4 متغیر در شرایط خاصی قرار گرفتند آنگاه به مرحله بعدی می رود. در این مرحله مثلاً متغیر c را چک می کند و ال آخر
می خواستم بدانم روش اصولی پیاده سازی چنین الگوریتمی چگونه است. من خودم با استفاده از تایمرها پیاده سازی کردم. مثلاً ابتدا تایمر اول شروع به کار می کند و در فواصل زمانی مشخص متغیر a را چک می کند. هر گاه a شرط لازم را داشت آنگاه تایمر اول غیر فعال شده و تایمر دوم شروع به کار می کند. این تایمر نیز در فواصل زمانی مشخص مقادیر 4 متغیر b1 تا b4 را چک می کند. هر زمان این 4 متغیر شرایط مورد نظر ما را داشتند آنگاه تایمر دوم را هم غیر فعال می کنم و تایمر سوم شروع به کار می کند و ال آخر.

ممنون می شوم دوستان راهنمایی کنند که آیا این کار اصولی است یا خیر و اصولاً روش منطقی برای پیاده سازی اینچنین الگوریتم ها چیست؟ ممنون

exlord
دوشنبه 05 اردیبهشت 1390, 10:11 صبح
public class MyData
{
private enum Steps
{
A = 1,
B,
C,
D
}
private Steps _step;
private int _a;
private int _b1;
private int _b2;

public int a
{
get { return _a; }
set { _a = value; a_Changed(); }
}
public int b1
{
get { return _b1; }
set { _b1 = value; b_Changed(); }
}
public int b2
{
get { return _b2; }
set { _b2 = value; b_Changed(); }
}


private void a_Changed()
{
if (_step == Steps.A)
{
if (_a == 10) _step = Steps.B;
}
}

private void b_Changed()
{
if (_step == Steps.B)
{
if (_b1 == 20 && _b2 == 30)
_step = Steps.C;
}
}
}

smt1383
سه شنبه 06 اردیبهشت 1390, 07:42 صبح
ممنون از راهنماییتان. خیلی جالب بود. می خواستم بدانم اینگونه الگوریتم ها که ما State های مختلفی داریم و بر حسب شرایط برنامه باید از یک State به State دیگر برویم، نام و عنوان خاصی دارند؟ آیا منبعی برای توضیحات کامل تر برای این نوع برنامه ها سراغ دارید؟ ممنون

exlord
سه شنبه 06 اردیبهشت 1390, 11:01 صبح
می خواستم بدانم اینگونه الگوریتم ها که ...... نام و عنوان خاصی دارند؟ نمیدونم :قهقهه: ... من همینجوری این به فکرم رسید نوشتم ...

آیا منبعی برای توضیحات کامل تر برای این نوع برنامه ها سراغ دارید؟ از اونجایی که نمیدونم اینگونه برنامه ها چی هستن پس نه ... اینجا a_Changed() در واقع یه event handler سادس ... کاملترش میشه اینجوری ...
public enum Steps
{
A = 1,
B,
C,
D
}
public class MyData
{
public Steps Step { get; set; }
private int _a;
private int _b1;
private int _b2;

public delegate void ValueChangedEventHandler(object sender, EventArgs e);
public event ValueChangedEventHandler PropertyValueChanged;

public int a
{
get { return _a; }
set { _a = value; PropertyValueChanged(this, new EventArgs()); }
}
public int b1
{
get { return _b1; }
set { _b1 = value; PropertyValueChanged(this, new EventArgs()); }
}
public int b2
{
get { return _b2; }
set { _b2 = value; PropertyValueChanged(this, new EventArgs()); }
}
}

private void button2_Click(object sender, EventArgs e)
{
MyData data = new MyData();
data.PropertyValueChanged += new MyData.ValueChangedEventHandler(data_PropertyValue Changed);
}

void data_PropertyValueChanged(object sender, EventArgs e)
{
MyData data = sender as MyData;
switch (data.Step)
{
case Steps.A:
if (data.a == 10) data.Step = Steps.B;
break;
case Steps.B:
if (data.b1 == 20 && data.b2 == 30)
data.Step = Steps.C;
break;
case Steps.C:
break;
case Steps.D:
break;
}
}

البته این به حالت کلیه ... میتونین برای هر متغیر یه event جداگانه تعریف کنین ...