PDA

View Full Version : سوال: باز و بسته کردن thread ایجاد شده



elahe1393
دوشنبه 05 آبان 1393, 11:27 صبح
سلام من تو برنامه یه thread میسازم که میخوام همزمان با اجرای برنامه ام از پورت سریال اطلاعات رو بخونه به این شکل thread رو ساختم
delegate void Fesfunc();
Fesfunc threadRead;
این دو رو بصورت سراسری تعریف کردم بعد کدهای زیر رو تو دکمه شروع برنامه نوشتم
Fesfunc fescommand = new Fesfunc(Fescommand);
threadRead = new Fesfunc(Fescommand);
threadRead.BeginInvoke(null, null);
که تابع Fescommand عمل خوندن از پورت و تفکیک سازی بسته های دریافتی رو انجام میده
حالا در این بین من این بسته های دریافتی رو وقتی تفکیک کردم روی نمودار نشون میدم نقطه به نقطه
این بسته ها شامل زاویه و سرعت در زاویه و یه سری اطلاعات دیگر هست که من این دو مقدار اول مورد نیازم هست
توی برنامه تنظیماتی وجود داره که مشخص میکنه شخص چه زاویه تا چه زاویه ای براش مهمه
من میخوام وقتی به زاویه پایانی رسیدم یعنی بسته ای رو دریافت کردم که شامل زاویه پایانی بود (برای اینکار یه while نوشتم که این موضوع رو بررسی کنه) دیگه اطلاعات دریافتی برام مهم نیست میخوام این thread متوقف بشه و در صورتیکه مجدد به اطلاعات نیاز داشتم thread فعال بشه و شروع به خواندن از پورت کنه الان وقتی زاویه پایانی دریافت میشه من پورت رو میبندم چون نیازی بهش ندارم ولی این thread ادامه پیدا میکنه و میخواد از پورت بسته بخونه بخاطر همین پیغام خطا میده
مثلا من میخوام یه کاری رو چند بار تکرار کنم بار اول بازه زاویه مورد توجه قرار میگیره و منحنی روی نمودار رسم میشه بعد نیازی به خوندن ندارم تا که میرم سراغ تکرار دوم حالا میخوام مجدد خوندن از پورت شروع بشه و بازه زاویه برام مهمه و ....
حالا چطور میتونم بین thread اصلی و فرعی هماهنگی برقرار کنم که تا رسیدن به زاویه پایانی thread فرعی کار کنه بعد متوقف بشه بعد تو تکرار بعدی مجدد ادامه کار کنه بعد دوباره رسید به زاویه پایانی متوقف بشه؟

elahe1393
دوشنبه 05 آبان 1393, 11:29 صبح
از waitone و set هم استفاده کردم ولی جواب نداد بعد از set دیگه Thread فرعی یه بار میخونه به خوندن ادامه نمیده

pedram.11
دوشنبه 05 آبان 1393, 12:38 عصر
سلام شما با Monitor.Wait و Monitor.Pulse میتونید بین نخ ها هماهنگی ایجاد کنید. البته اگه کد بیشتری بذارید بهتر میشه کدتون رو تصحیح کرد

elahe1393
دوشنبه 05 آبان 1393, 13:21 عصر
این تابع thread هست
private void Fescommand()
{
while (true)
{
try
{
if (start)
{
string str = ReceiveData();
string[] recieveDataPack = str.Split(new char[] { '$', ',', '#' }, StringSplitOptions.RemoveEmptyEntries);

if (recieveDataPack.Length == 8)
{
recievedData.LeftHardnessLevel = int.Parse(recieveDataPack[4]);
recievedData.LeftSpeed = (-1) * int.Parse(recieveDataPack[5]);
recievedData.LeftPoint = ((-1) * (int.Parse(recieveDataPack[6]) * 360) / 800).ToString();
recievedData.RightHardnessLevel = int.Parse(recieveDataPack[1]);
recievedData.RightSpeed = int.Parse(recieveDataPack[2]);
recievedData.RightPoint = ((int.Parse(recieveDataPack[3]) * 360) / 800).ToString();
}
if (sid == "Left")
{
if (recievedData.LeftPoint == endPoint)
{ find = true; }
}
else
{
if (recievedData.RightPoint == endPoint)
{ find = true; }
}
}
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}

}
تابع ReceiveData() مطابق زیر هست
private string ReceiveData()
{
try
{
string receiveData;
receiveData = serialPort.ReadLine();
return receiveData;
}
catch
{
MessageBox.Show("مشکلی در دریافت اطلاعات بوجود آمده است \nلطفا از باز بودن پورت مطمئن شده و مجددا امتحان کنید", "دریافت اطلاعات از دستگاه");
}
return null;
}
یه دکمه شروع دارم که ابتدا پورت رو باز میکنه بعد thread رو میسازه بعد یه حلقه داره که شامل تعداد تکرار حرکات دستگاه هست که این تعداد بین دو بازوی دستگاه تقسیم میشه پس من نیاز دارم تو این حلقه تشخیص بدم کدوم بازو هستم تنظیمات بازو چیه که زاویه پایانی مشخص بشه بعد منحنی بر روی نمودار مربوط به اون بازو رسم بشه
حلقه ای که پیداشدن زاویه پایانی رو چک میکنه مطابق زیر هست
while (find == false)
{
continue;
}
بعد از پایان تکرارها پورت بسته میشه ولی thread به کار خودش ادامه میده و میخواد از پورت بسته بخونه که نمیتونه و خطا میده حالا چطور بین رویداد کلیک دکمه شروع و thread خوندن هماهنگی ایجاد کنم؟

pedram.11
دوشنبه 05 آبان 1393, 22:14 عصر
سلام ببخشید دیر جواب میدم بیرون بودم

یه تغییراتی به کداتون دادم:
object LockObj = new object();
bool Closed = true;
private void Fescommand()
{
while (true)
{
lock (LockObj)
{
if (Closed)
Monitor.Wait(LockObj);
try
{
if (start)
{
string str = ReceiveData();
string[] recieveDataPack = str.Split(new char[] { '$', ',', '#' }, StringSplitOptions.RemoveEmptyEntries);


if (recieveDataPack.Length == 8)
{
recievedData.LeftHardnessLevel = int.Parse(recieveDataPack[4]);
recievedData.LeftSpeed = (-1) * int.Parse(recieveDataPack[5]);
recievedData.LeftPoint = ((-1) * (int.Parse(recieveDataPack[6]) * 360) / 800).ToString();
recievedData.RightHardnessLevel = int.Parse(recieveDataPack[1]);
recievedData.RightSpeed = int.Parse(recieveDataPack[2]);
recievedData.RightPoint = ((int.Parse(recieveDataPack[3]) * 360) / 800).ToString();
}
if (sid == "Left")
{
if (recievedData.LeftPoint == endPoint)
{ find = true; }
}
else
{
if (recievedData.RightPoint == endPoint)
{ find = true; }
}
}
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}
}


}
private string ReceiveData()
{
try
{
string receiveData;
receiveData = serialPort.ReadLine();
return receiveData;
}
catch
{
MessageBox.Show("مشکلی در دریافت اطلاعات بوجود آمده است \nلطفا از باز بودن پورت مطمئن شده و مجددا امتحان کنید", "دریافت اطلاعات از دستگاه");
}
return null;
}
// متد بستن پورت
void CloseCnt()
{
lock (LockObj)
{
while (find == false)
{
continue;
}
Closed = true;
}
}
// دکمه شروع که پورت رو باز میکنه
void Start()
{
lock (LockObj)
{
// پورت رو باز کن
//...
Closed = false;
Monitor.PulseAll(LockObj);
}
}

elahe1393
سه شنبه 06 آبان 1393, 09:28 صبح
مرسی بابت راهنماییتون
وقتی متد بستن پورت آغاز میشه موازی اون Fescommand() هم اجرا میشه الان مشکلی که وجود داره اینه که حین اجرای متد بستن پورت وقتی اولین بار وارد Fescommand() میشه بعد از lock (LockObj) رو اجرا نمیکنه و همش داخل حلقه while متد بستن پورت میچرخه چون دیگه Fescommand() اجرا نمیشه که find = true بشه! کار lock (LockObj)چیه که شما در تمام توابع استفاده کردید؟ بدون این بخش همون خطای قبلی رو حین اجرا میده

pedram.11
سه شنبه 06 آبان 1393, 10:11 صبح
سلام
متد Fescommand رو کمی تغییر دادم. اینو چک کنید:
private void Fescommand()
{
while (true)
{
if(!Monitor.TryEnter(LockObj,100))
continue;
if (Closed)
Monitor.Wait(LockObj);
try
{
_Fescommand();
}
catch{ }
Monitor.Exit(LockObj);
}
}
void _Fescommand()
{
try
{
if (start)
{
string str = ReceiveData();
string[] recieveDataPack = str.Split(new char[] { '$', ',', '#' }, StringSplitOptions.RemoveEmptyEntries);


if (recieveDataPack.Length == 8)
{
recievedData.LeftHardnessLevel = int.Parse(recieveDataPack[4]);
recievedData.LeftSpeed = (-1) * int.Parse(recieveDataPack[5]);
recievedData.LeftPoint = ((-1) * (int.Parse(recieveDataPack[6]) * 360) / 800).ToString();
recievedData.RightHardnessLevel = int.Parse(recieveDataPack[1]);
recievedData.RightSpeed = int.Parse(recieveDataPack[2]);
recievedData.RightPoint = ((int.Parse(recieveDataPack[3]) * 360) / 800).ToString();
}
if (sid == "Left")
{
if (recievedData.LeftPoint == endPoint)
{ find = true; }
}
else
{
if (recievedData.RightPoint == endPoint)
{ find = true; }
}
}
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}
lock یا Monitor.Enter وقتی روی یک آبجکت انجام میشه در برنامه های مالی ترد وقتی ترد دیگه میخواد آبجکت رو لاک کنه منتظر میمونه تا اون آبجکت که قبلا لاک شده از لاک در بیاد که البته باید توجه کرد که اگه اشتباهی پیش بیاد و یوقتی یکبار آبجکت از لاک در نیومد(طی ارور یا هر مشکل دیگه...) برنامه از کار میفته و کن فیکون میشه :اشتباه:

elahe1393
سه شنبه 06 آبان 1393, 10:45 صبح
بازم مرسی
الان وقتی یکبار _Fescommand(); رو اجرا میکنه همینطور که تو حلقه while متد بستن پورت میچرخه دوباره که می خواد تابع موازی Fescommand() رو اجرا کنه تو این
if(!Monitor.TryEnter(LockObj,100))
continue;

بخش میچرخه و دیگه نمیتونه بره سراغ _Fescommand(); چه کنم؟

pedram.11
سه شنبه 06 آبان 1393, 11:00 صبح
پس شما احتمالا در کدهای دیگه که lock صورت میگیره به ارور برمیخورید.
متد های CloseCnt و Start رو به همین صورت که Fescommand رو تغییر دادم درست کنید:
void CloseCnt()
{
Monitor.Enter(LockObj);
try
{
_CloseCnt();
}
catch{ }
Monitor.Exit(LockObj);
}
void _CloseCnt()
{
while (find == false)
{
continue;
}
Closed = true;
}
// دکمه شروع که پورت رو باز میکنه
void Start()
{
Monitor.Enter(LockObj);
try
{
_Start();
}
catch { }
Monitor.Exit(LockObj);
}
void _Start()
{
// پورت رو باز کن
//...
Closed = false;
Monitor.PulseAll(LockObj);
}

elahe1393
سه شنبه 06 آبان 1393, 11:14 صبح
مرسی با این تغییر هم مجدد همون مشکل آخر وجود دارد وقتی وارد متد بستن پورت می شود میفتد تو شرط
if(!Monitor.TryEnter(LockObj,100))
continue;




اگه مشکل از اون دو متد هست پس چرا وقتی start اجرا میشه مشکلی نیست Fescommand کارشو شروع میکنه و ادامه میده ولی وقتی close اجرا میشه میفته تو اون شرط؟!

pedram.11
سه شنبه 06 آبان 1393, 11:22 صبح
مقدار Closed در اون موقع چی هست؟ چک کنید متد _CloseCnt کارش تموم میشه؟ متد _Start چطور؟ شما باید با BreakPoint این متدهارو بررسی کنید که آیا کار متدها تموم میشن یا نه

elahe1393
سه شنبه 06 آبان 1393, 11:28 صبح
نه دیگه من میخوام یه جورایی CloseCnt_ و _Fescommand با هم کار کنن چون نتیجه مقدار find که در Fescommand_ مقداردهی میشه در CloseCnt_ بررسی میشه
نه کار CloseCnt_ ادامه داره به همین خاطر وقتی میره تو اون تابع تو شرط گیر میکنه نمیشه هر دو باهم مقداردهی و بررسی رو انجام بدن؟ چون موقعی باید کار CloseCnt_ تموم بشه که find = true میشه تا قبل این _Fescommand باید دائما تکرار بشه تا بسته ها رو از پورت سریال دریافت کنه تا مقداررو پیدا کرد find = true بشه

elahe1393
سه شنبه 06 آبان 1393, 11:32 صبح
اگه من متد بسته شدن پورت رو اینجوری بنویسم درسته
void CloseCnt()
{
try
{
while (find == false)
{
Monitor.Enter(LockObj);
continue;
Monitor.Exit(LockObj);
}
}
catch{}
closed = true;
}

pedram.11
سه شنبه 06 آبان 1393, 11:50 صبح
آهااااا :لبخند:
پس همچین حالتیه:
متد _Fescommand تا وقتی که کانکشن باز هست
متد _CloseCnt تا وقتی که !find هست
با تغییر 1 خط در متد _CloseCnt. تو حلقه بجای continue باید لاک رو آزاد کنید و منتظر بمونید تا دیتای بعدی دریافت بشه...
void _CloseCnt()
{
while (find == false)
Monitor.Wait(LockObj);
Closed = true;
}

و در متد _Fescommand با اضافه کردن یک خط، با هربار دریافت دیتا باید یک بار هم آبجک pulse شه تا حلقه _CloseCnt دوباره به کار خودش ادامه بده:



void _Fescommand()
{
try
{
if (start)
{
string str = ReceiveData();
string[] recieveDataPack = str.Split(new char[] { '$', ',', '#' }, StringSplitOptions.RemoveEmptyEntries);


if (recieveDataPack.Length == 8)
{
recievedData.LeftHardnessLevel = int.Parse(recieveDataPack[4]);
recievedData.LeftSpeed = (-1) * int.Parse(recieveDataPack[5]);
recievedData.LeftPoint = ((-1) * (int.Parse(recieveDataPack[6]) * 360) / 800).ToString();
recievedData.RightHardnessLevel = int.Parse(recieveDataPack[1]);
recievedData.RightSpeed = int.Parse(recieveDataPack[2]);
recievedData.RightPoint = ((int.Parse(recieveDataPack[3]) * 360) / 800).ToString();
}
if (sid == "Left")
{
if (recievedData.LeftPoint == endPoint)
{ find = true; }
}
else
{
if (recievedData.RightPoint == endPoint)
{ find = true; }
}
Monitor.PulseAll(FindLockObj);
}
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}
}

elahe1393
سه شنبه 06 آبان 1393, 12:08 عصر
مرسی که وقتتونو گذاشتید فقط یه سوال ببخشیدا الان من از اول همه کدهایی که گفتید رو بذارم باشه یا همه رو پاک کنم بعد کجارو تغییر بدم؟

pedram.11
سه شنبه 06 آبان 1393, 12:22 عصر
خواهش میگنم :لبخندساده:
نه فقط دو خط تغییرات میخواد:
توی متد _CloseCnt در حلقه while به جای continue کد زیر بذارید:
Monitor.Wait(LockObj);


و در متد _Fescommand با هربار دریافت فایل یا کد زیر رو اضافه کنید:
Monitor.PulseAll(FindLockObj);

اگه توجه کنید این دو خط کد رو بین دو تگ <u> گذاشتم

elahe1393
سه شنبه 06 آبان 1393, 13:26 عصر
الان مشکل جدید هست هنگام اجرای Monitor.Wait(LockObj); پیغام خطای زیر را میده
125055
مشکل چی هست الان من یه شکی که دارم اینه که کدهای قبل پست
آهااااا :لبخند:
پس همچین حالتیه:
بزارم باشه و این دو خط کد رو تغییر بدم یا اینکه باید تو همون کد اول خودم این دو خط کد رو وارد کنم
نگید خنگما!

elahe1393
سه شنبه 06 آبان 1393, 13:54 عصر
یعنی منظورم اینه که کدها بصورت زیر باشه
متد مربوط به thread
//------------- Thread Read Of Port ---------------
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)
{
string str = ReceiveData();
string[] recieveDataPack = str.Split(new char[] { '$', ',', '#' }, StringSplitOptions.RemoveEmptyEntries);

if (recieveDataPack.Length == 8)
{
recievedData.LeftHardnessLevel = int.Parse(recieveDataPack[4]);
recievedData.LeftSpeed = (-1) * int.Parse(recieveDataPack[5]);
recievedData.LeftPoint = ((-1) * (int.Parse(recieveDataPack[6]) * 360) / 800).ToString();
recievedData.RightHardnessLevel = int.Parse(recieveDataPack[1]);
recievedData.RightSpeed = int.Parse(recieveDataPack[2]);
recievedData.RightPoint = ((int.Parse(recieveDataPack[3]) * 360) / 800).ToString();
}
if (sid == "Left")
{
if (endPoint != null)
{
if (recievedData.LeftPoint == endPoint)
{ find = true; }
}
}
else
{
if (endPoint != null)
{
if (recievedData.RightPoint == endPoint)
{ find = true; }
}
}

Monitor.PulseAll(LockObj);
}
}
catch (Exception e)
{
MessageBox.Show("" + e.Message);
}

}
متد مربوط به شروع خوندن
//------------ Start Thread Read ------------------
void Start()
{
Monitor.Enter(LockObj);
try
{
_Start();
}
catch { }
Monitor.Exit(LockObj);
}

void _Start()
{
closed = false;
Monitor.PulseAll(LockObj);
}
متد مربوط به خاتمه خوندن
//------------- Close Thread Read ----------------
void CloseCnt()
{
//Monitor.Enter(LockObj);
try
{
_CloseCnt();
}
catch { }
closed = true;
//Monitor.Exit(LockObj);
}

void _CloseCnt()
{
while (find == false)
{
Monitor.Wait(LockObj);
//continue;
}
}
با این حالت این خطا صورت میگیره

pedram.11
سه شنبه 06 آبان 1393, 15:04 عصر
در متد بستن کانکش شما نباید Monitor.Enter و Monitor.Exit رو کامنت کنید. عمل Wait و Pulse وقتی انجام میشه که آبجکت لاک شده باشه. اون دوتارو از کامنت دربیارید اوکی میشه i wish :تشویق:

elahe1393
سه شنبه 06 آبان 1393, 15:30 عصر
خیلی خیلی ازتون ممنونم ایشالا تو تمام مراحل زندگیتون موفق باشید
فقط الان یه مشکلی بوجود اومده
من می خوام این نقاطی که از بسته های دریافتی تفکیک میکنم رو بصورت realtime روی نمودار رسم کنم این روند تا قبل از این انجام میشد ولی الان حین تفکیک سازی بسته ها و اجرای thread خواندن رویداد تایمرم متوقف میشه تا زمانیکه کارش تموم بشه به همین خاطر نمودار رسم نمیشه
رویداد تایمرم بصورت زیر هستش آیا این تابع هم نیاز داره با thread های دیگه هماهنگ بشه اگه اینطوره پس چرا قبلا کار میکرد
//---------- Show Date And Time -----------------
private void timerWorkWithDevice_Tick(object sender, EventArgs e)
{
DateTime time1 = new DateTime();
time1 = DateTime.Now;
PersianCalendar objCalender = new PersianCalendar();
TimeDate timeDate = new TimeDate();
lblDateTime.Text = timeDate.ConvertToDay_Month(objCalender.GetYear(ti me1).ToString(), objCalender.GetMonth(time1).ToString(), objCalender.GetDayOfMonth(time1).ToString(), objCalender.GetHour(time1).ToString(), objCalender.GetMinute(time1).ToString(), objCalender.GetSecond(time1).ToString());
DrawPoint(recievedData, sid, startPoint, endPoint, reapetID.ToString(), reapetNumber);
}
تابع DrawPoint تابعی هست که مسئولیت رسم یه نقطه در نمودار رو داره

elahe1393
چهارشنبه 07 آبان 1393, 09:32 صبح
آیا تایمر در یک برنامه ای که موازی سازی شده است باید با thread ها هماهنگ سازی شود در حال حاضر هنگام اجرای thread تایمر متوقف می شود مشکل چیست؟

pedram.11
چهارشنبه 07 آبان 1393, 09:36 صبح
خیلی ممنون شما هم همینطور :خجالت:
احتمالا تایمر شما در همون ترد ساخته و اجرا شده. برای رفع این مشکل یک متد جدید برای اجرای تایمر بسازید و اونو در یک ترد جدید اجرا کنید

elahe1393
چهارشنبه 07 آبان 1393, 09:43 صبح
من یک کنترل تایمر به فرم اضافه کردم و در رویداد tick کدهای مربوط رو نوشتم در این صورت قضیه چیه من چطور باید اینو هماهنگ کنم در این زمینه اطلاعات کمی دارم دقیقا منظورتونو متوجه نشدم یعنی رویداد tick رو تو یه متد قرار بدم و اون متد رو موازی اجرا کنم بعد همین Monitor.Enter(LockObj); و Monitor.Exit(LockObj); رو در اون بکار ببرم یا تو همین رویداد tick که مربوط به تایمر فرم هست این دو کد رو بکار ببرم؟

pedram.11
چهارشنبه 07 آبان 1393, 09:55 صبح
نخیر. متد Start تایمر رو در ترد قرار بدید اگه همونطور که گفتم تایمرتون در همون ترد دریافت اطلاعات باشه، یعنی هر جایی که تایمرو اجرا کردید اینو بذارید. اینطوری:
new Thread(new ThreadStart(timerWorkWithDevice.Start)).Srart();
البته در اینصورت باید یه تغییراتی در متد tick هم بدید:
private void timerWorkWithDevice_Tick(object sender, EventArgs e)
{
if (InvokeRequired)
BeginInvoke(new EventHandler(timerWorkWithDevice_Tick), new object[] { sender, e});
else
{
DateTime time1 = new DateTime();
time1 = DateTime.Now;
PersianCalendar objCalender = new PersianCalendar();
TimeDate timeDate = new TimeDate();
lblDateTime.Text = timeDate.ConvertToDay_Month(objCalender.GetYear(ti me1).ToString(), objCalender.GetMonth(time1).ToString(), objCalender.GetDayOfMonth(time1).ToString(), objCalender.GetHour(time1).ToString(), objCalender.GetMinute(time1).ToString(), objCalender.GetSecond(time1).ToString());
DrawPoint(recievedData, sid, startPoint, endPoint, reapetID.ToString(), reapetNumber);
}
}




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

elahe1393
چهارشنبه 07 آبان 1393, 10:07 صبح
تایمر هم تاریخ و ساعت روز رو به من نشون میده هم اینکه نیاز دارم از همون لحظه اولی که با دستگاه ارتباط برقرار میکنم هر بسته ای که دریافت کرد و داده رو تفکیک کرد روی نمودار نمایش بده صحیح بودن find فقط برای به پایان رسوندن ارتباط هست یه بار بعد از تفکیک سازی خواستم رسمش کنه رسم نمیکرد میزاشت وقتی همه داده ها به سری منحنی اضافه شد رسمش میکرد این مورد نیاز من نیست میخوام همون لحظه رسمش کنه همه بسته های دریافتی برام مهمه میخوام رسمش کنم امیدوارم با توضیحی که شما دادید بکار ببرم مشکل حل بشه
بنظرتون متد Start تایمر رو تو متد لود فرم بزارم نتیجه دلخواهمو میده؟
تایمرو من جایی اجرا نکردم وقتی enabled شو true کردم همون لحظه که فرم لود میشه شروع به اجرا میکنه فقط وقتی دکمه شروع رو میزنم که thread هام شروع به کار میکنه دچار توقف میشه و وقتی thread ها خاتمه پیدا میکنه دوباره شروع به کار میکنه ولی نمودار رسم نمیکنه

pedram.11
چهارشنبه 07 آبان 1393, 10:18 صبح
همون روشی که خواستید انجام بدید ولی به نتیجه نرسیدید روش درستیه. چون هم بلا فاصله بعد از تفکیک دیتا نمایش داده میشه و هم مثه تایمر هی چک نمیکنه که دیتای جدید اومده یا نه.
اگه از روش تایمر نیاز به هماهنگی داشتید بنظرم شما دوباره روی همون حالت کار کنید و منم کمکتون میکنم که راش بندازید :تشویق:

elahe1393
چهارشنبه 07 آبان 1393, 11:01 صبح
مرسی مشکل حل شد رسم رو اوردم تو همون thread خوندن دیتا فقط مشکل تایمر حل نشده بعد از کلیک برروی دکمه شروع متوقف میشه و زمان تغییر نمیکنه!!

pedram.11
چهارشنبه 07 آبان 1393, 11:30 صبح
شروع تایمر تو قسمت شروع هم با ترد انجام میشه؟ منظورم اگه جای دیگه هم تایمر رو بصورت معمولی استارت میکنید تغییرش بدید و با ترد اجراش کنید

elahe1393
چهارشنبه 07 آبان 1393, 11:45 صبح
خیر فقط ویندوزی شروع به کار میکنه با لود شدن فرم دیگه منصرف شدم برای وجود تایمر
مشکلم حل شد ممنون از راهنماییهاتون موفق باشید