elahe1393
سه شنبه 20 آبان 1393, 14:27 عصر
در ادامه این سوال (http://barnamenevis.org/showthread.php?473787-%D8%A8%D8%A7%D8%B2-%D9%88-%D8%A8%D8%B3%D8%AA%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-thread-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%B4%D8%AF%D9%87)که مشکلم حل شد
نیازهای برنامه ام عوض شده براساس اینکه یه دستگاه دارم که دو تا بازو داره با پورت سریال باهاش در ارتباطم تنظیم میکنم که کدوم بازو فعال باشه و چندتا تکرار حرکت داشته باشه اگر یه بازو فعال باشه نمودار تغییر زاویه و سرعت مربوط به اون بازو در picturebox مربوط به اون بازو رسم میشه این زاویه و سرعت بازو از یه thread فرعی که موازی برنامه اصلی داره اجرا میشه تامین میشه هر بار که حرکت تکرار میشه یه نمودار جدید به picturebox مربوطه اضافه میشه پایان هر تکرارم از اونجایی مشخص میشه که من یه بار بازو رو در جهت حرکت تکون میدم بعد برمیگردم دوباره که میخوام در جهت حرکت ، حرکت کنم تکرار تموم میشه و میره تکرار بعدی یعنی اینجوری رسم بشه
125538
حالا مشکل من اونجاییه که وقتی دو تا بازو فعال باشه من مثلا تعیین میکنم 3 بار تکرار انجام بشه هر بازو باید مجزا سه بار حرکت کنه نمودارش تو picturebox مربوط به خودش رسم بشه و پایان تکرار خاص خودشو داره این رسم هم باید همزمان برای هر دو بازو انجام بشه(چه دو بازو همزمان حرکت کنن چه ناهمزمان) پس من نیاز دارم برای رسم نمودار دو بازو همزمان کاری کنم یه سری کد دوبار همزمان البته با مقادیر متفاوت اجرا بشه پس نیاز به یه ترد جدید دارم وقتی میخوام مثلا بازوی راست رو تو thread اصلیم رسم کنم که داره داده هاشو از thread فرعی میگیره نیاز دارم همزمان یه thread دیگه هم ایجاد کنم که همین کار رو روی بازو چپ انجام بده داده هاشو از thread فرعی بگیره رسم کنه
الان مشکل اصلیم اینه که این کار انجام میشه ولی نتایجم کمی غیرمنطقیه و اینکه یه تاخیری در رسم وجود داره و اینکه میخوام مثلا حلقه تکرارم یه بار انجام بشه ولی وقتی حلقه تموم میشه دوباره اجرا میشه
لطفا راهنمایی کنید آیا روشم درسته چیکار باید بکنم
delegate void Fesfunc();
Fesfunc threadRead;
delegate void Fesfunc1();
Fesfunc1 threadDrawRightChart;
private object LockObj = new object();
private bool start = false, closed = true, endReapet = false;
private void btnStart_Click(object sender, EventArgs e)
{
یه سری کد
start = true;
Fesfunc fescommand = new Fesfunc(Fescommand);
threadRead = new Fesfunc(Fescommand);
threadRead.BeginInvoke(null, null);
یه سری کد
if (lblLeftIsEnable.Text == "بازوی چپ فعال است" && lblRightIsEnable.Text == "بازوی راست فعال است")
{
leftRightEnable = true;
}
یه سری کد
if (leftRightEnable == true)
{
Fesfunc1 drawRightChart = new Fesfunc1(DrawRightChart);
threadDrawRightChart = new Fesfunc1(DrawRightChart);
threadDrawRightChart.BeginInvoke(null, null);
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی چپ و رسم نمودار زمینه چارت
CloseCnt();
}
}
else
{
if (lblLeftIsEnable.Text == "بازوی چپ فعال است")
{
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی چپ و رسم نمودار زمینه چارت
CloseCnt();
}
}
else if (lblRightIsEnable.Text == "بازوی راست فعال است")
{
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی راست و رسم نمودار زمینه چارت
CloseCnt();
}
}
یه سری کد
}
private void DrawRightChart()
{
Monitor.Enter(LockObj);
try
{
_DrawRightChart();
}
catch { }
Monitor.Exit(LockObj);
}
private void _DrawRightChart()
{
یه سری کد
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی راست و رسم نمودار زمینه چارت
CloseCnt();
}
}
private void Fescommand()
{
while (true)
{
if (!Monitor.TryEnter(LockObj, 100))
continue;
if (closed)
Monitor.Wait(LockObj);
try
{
_Fescommand();
}
catch { }
Monitor.Exit(LockObj);
}
private void _Fescommand()
{
try
{
if (start)
{
یه سری کد برای تفکیک اطلاعات دریافتی
یه سری کد برای رسم خط سرعت در زاویه
یه سری کد برای بررسی پایان تکرار حرکت
if (شرط)
{
endReapet = true;
یه سری کد
}
}
Monitor.PulseAll(LockObj);
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}
void Start()
{
Monitor.Enter(LockObj);
try
{
_Start();
}
catch { }
Monitor.Exit(LockObj);
}
void _Start()
{
closed = false;
Monitor.PulseAll(LockObj);
}
void CloseCnt()
{
Monitor.Enter(LockObj);
try
{
_CloseCnt();
}
catch { }
closed = true;
Monitor.Exit(LockObj);
}
void _CloseCnt()
{
while (endReapet == false)
{
Monitor.Wait(LockObj);
}
}
نیازهای برنامه ام عوض شده براساس اینکه یه دستگاه دارم که دو تا بازو داره با پورت سریال باهاش در ارتباطم تنظیم میکنم که کدوم بازو فعال باشه و چندتا تکرار حرکت داشته باشه اگر یه بازو فعال باشه نمودار تغییر زاویه و سرعت مربوط به اون بازو در picturebox مربوط به اون بازو رسم میشه این زاویه و سرعت بازو از یه thread فرعی که موازی برنامه اصلی داره اجرا میشه تامین میشه هر بار که حرکت تکرار میشه یه نمودار جدید به picturebox مربوطه اضافه میشه پایان هر تکرارم از اونجایی مشخص میشه که من یه بار بازو رو در جهت حرکت تکون میدم بعد برمیگردم دوباره که میخوام در جهت حرکت ، حرکت کنم تکرار تموم میشه و میره تکرار بعدی یعنی اینجوری رسم بشه
125538
حالا مشکل من اونجاییه که وقتی دو تا بازو فعال باشه من مثلا تعیین میکنم 3 بار تکرار انجام بشه هر بازو باید مجزا سه بار حرکت کنه نمودارش تو picturebox مربوط به خودش رسم بشه و پایان تکرار خاص خودشو داره این رسم هم باید همزمان برای هر دو بازو انجام بشه(چه دو بازو همزمان حرکت کنن چه ناهمزمان) پس من نیاز دارم برای رسم نمودار دو بازو همزمان کاری کنم یه سری کد دوبار همزمان البته با مقادیر متفاوت اجرا بشه پس نیاز به یه ترد جدید دارم وقتی میخوام مثلا بازوی راست رو تو thread اصلیم رسم کنم که داره داده هاشو از thread فرعی میگیره نیاز دارم همزمان یه thread دیگه هم ایجاد کنم که همین کار رو روی بازو چپ انجام بده داده هاشو از thread فرعی بگیره رسم کنه
الان مشکل اصلیم اینه که این کار انجام میشه ولی نتایجم کمی غیرمنطقیه و اینکه یه تاخیری در رسم وجود داره و اینکه میخوام مثلا حلقه تکرارم یه بار انجام بشه ولی وقتی حلقه تموم میشه دوباره اجرا میشه
لطفا راهنمایی کنید آیا روشم درسته چیکار باید بکنم
delegate void Fesfunc();
Fesfunc threadRead;
delegate void Fesfunc1();
Fesfunc1 threadDrawRightChart;
private object LockObj = new object();
private bool start = false, closed = true, endReapet = false;
private void btnStart_Click(object sender, EventArgs e)
{
یه سری کد
start = true;
Fesfunc fescommand = new Fesfunc(Fescommand);
threadRead = new Fesfunc(Fescommand);
threadRead.BeginInvoke(null, null);
یه سری کد
if (lblLeftIsEnable.Text == "بازوی چپ فعال است" && lblRightIsEnable.Text == "بازوی راست فعال است")
{
leftRightEnable = true;
}
یه سری کد
if (leftRightEnable == true)
{
Fesfunc1 drawRightChart = new Fesfunc1(DrawRightChart);
threadDrawRightChart = new Fesfunc1(DrawRightChart);
threadDrawRightChart.BeginInvoke(null, null);
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی چپ و رسم نمودار زمینه چارت
CloseCnt();
}
}
else
{
if (lblLeftIsEnable.Text == "بازوی چپ فعال است")
{
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی چپ و رسم نمودار زمینه چارت
CloseCnt();
}
}
else if (lblRightIsEnable.Text == "بازوی راست فعال است")
{
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی راست و رسم نمودار زمینه چارت
CloseCnt();
}
}
یه سری کد
}
private void DrawRightChart()
{
Monitor.Enter(LockObj);
try
{
_DrawRightChart();
}
catch { }
Monitor.Exit(LockObj);
}
private void _DrawRightChart()
{
یه سری کد
for (int i = 1; i <= int.Parse(lblReapetValue.Text); i++)
{
Start();
endReapet = false;
یه سری کد برای عملیات مربوط به بازوی راست و رسم نمودار زمینه چارت
CloseCnt();
}
}
private void Fescommand()
{
while (true)
{
if (!Monitor.TryEnter(LockObj, 100))
continue;
if (closed)
Monitor.Wait(LockObj);
try
{
_Fescommand();
}
catch { }
Monitor.Exit(LockObj);
}
private void _Fescommand()
{
try
{
if (start)
{
یه سری کد برای تفکیک اطلاعات دریافتی
یه سری کد برای رسم خط سرعت در زاویه
یه سری کد برای بررسی پایان تکرار حرکت
if (شرط)
{
endReapet = true;
یه سری کد
}
}
Monitor.PulseAll(LockObj);
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}
void Start()
{
Monitor.Enter(LockObj);
try
{
_Start();
}
catch { }
Monitor.Exit(LockObj);
}
void _Start()
{
closed = false;
Monitor.PulseAll(LockObj);
}
void CloseCnt()
{
Monitor.Enter(LockObj);
try
{
_CloseCnt();
}
catch { }
closed = true;
Monitor.Exit(LockObj);
}
void _CloseCnt()
{
while (endReapet == false)
{
Monitor.Wait(LockObj);
}
}