PDA

View Full Version : سوال: بروزرسانی محتوا بدون استفاده از کنترل timer



birtemp
یک شنبه 29 بهمن 1391, 12:18 عصر
سلام
من می خواستم محتوای کنترل label رو بدون استفاده از کنترل تایمر بروزرسانی کنم. به دلیل اینکه نمی خوام سی پی یو دائماً مشغول باشه و هر موقع که منبع محتوا تغییر کرد محتوای label هم تغییر کنه (یه چیزی تو مایه های sync مبداء و مقصد).
تو داخل کنترل label می خوام میزان مصرف سی پی یو رو نشون بدم واسه همین وقتی از کنترل تایمر برا اینکار استفاده می کنم مصرف سی پی یو بیشتر میشه.
ممنون می شم دوستان کمکم کنن.

AGENT-20
یک شنبه 29 بهمن 1391, 12:42 عصر
خوب از تایمر استفاده نکن
یک تابع درست کن بده ب یک ترد که ی گوشه واسه خودش کارشو انجام بده
نه به برنامه درحال اجرای خودت کاری داره نه به سی پی یو

Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.Priority = ThreadPriority.Normal;
T1.Start();

void FunctionName()
{
-----
}

danialafshari
یک شنبه 29 بهمن 1391, 12:52 عصر
خوب از تایمر استفاده نکن
یک تابع درست کن بده ب یک ترد که ی گوشه واسه خودش کارشو انجام بده
نه به برنامه درحال اجرای خودت کاری داره نه به سی پی یو

Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.Priority = ThreadPriority.Normal;
T1.Start();

void FunctionName()
{
-----
}

لطفا از قالب بندی C# استفاده کنید
Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.Priority = ThreadPriority.Normal;
T1.Start();

void FunctionName()
{
-----
}

birtemp
یک شنبه 29 بهمن 1391, 13:59 عصر
خوب از تایمر استفاده نکن
یک تابع درست کن بده ب یک ترد که ی گوشه واسه خودش کارشو انجام بده
نه به برنامه درحال اجرای خودت کاری داره نه به سی پی یو

Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.Priority = ThreadPriority.Normal;
T1.Start();

void FunctionName()
{
-----
}
ممنون بابت کد. ولی بنده هم این رو میدونستم.
فقط مشکلم اینجا بود که نمیشه بروزرسانی رو بدون استفاده از کنترل تایمر انجام داد. به نحوی می خوام محتوای کنترل label هر 5 ثانیه یکبار رفرش یا بروزرسانی بشه.
این روشی که شما معرفی کردین فقط میتونه بدون دخالت در عملکرد برنامه و تو بک گراند بصورت مخفی یه فانکشنی رو اجرا کنه.
اگه روشی برای بروزرسانی محتوای کنترل برچسب سراغ دارین لطف کنین معرفی کنین (بدون استفاده از کنترل تایمر البته)

Mahmoud.Afrad
یک شنبه 29 بهمن 1391, 21:54 عصر
چرا نمیشه. برای بروزرسانی کنترل ها باید از delegate استفاده کنید.
برای اینکه هر چند ثانیه این کار انجام بشه داخل متدی که در نخ اجرا میشه یک حلقه while ایجاد کنید و انتهای حلقه نخ رو به مدت مورد نظر sleep کنید. نخ رو هم به صورت بکگراند در بیارید تا بسته شدن فرم این نخ هم از بین بره

private void Form1_Load(object sender, EventArgs e)
{
Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.IsBackground = true;
T1.Start();
}
void FunctionName()
{
while (true)
{
this.Invoke(new Action(
delegate
{
// update label
}
)
);

Thread.Sleep(5000);
}
}

کدهای آپدیت لیبل رو به جای update label قرار بدید.

birtemp
یک شنبه 29 بهمن 1391, 22:13 عصر
بازم ممنون
کد رو گذاشتم تو برنامه ولی وقتی برنامه رو اجرا می کنم موقعی که می خواد کنترل رو بروزرسانی کنه یه وقفه کوچولو پیش میاد.
نمی دونم چرا ولی اساساً باید این وقفه رخ نمی داد.
برنامه بنده با wpf طراحی شده و یکم با winform فرق داره!

danialafshari
یک شنبه 29 بهمن 1391, 22:16 عصر
سلام
فکر می کنم وقفه بدلیل کد زیر
Thread.Sleep(5000);
معادله 5 ثانیه

josh simpson
یک شنبه 29 بهمن 1391, 22:51 عصر
خوب از تایمر استفاده نکن
یک تابع درست کن بده ب یک ترد که ی گوشه واسه خودش کارشو انجام بده
نه به برنامه درحال اجرای خودت کاری داره نه به سی پی یو

Thread T1 = new Thread(new ThreadStart(FunctionName));
T1.Priority = ThreadPriority.Normal;
T1.Start();

void FunctionName()
{
-----
}
ضمن تشکر از راه حلتون، ولی روش شما هیچ فرقی با استفاده از تایمر نداره چون میزان استفاده ترد از cpu به برنامه اصلی تعلق داده می شه. از طرفی تایمر خودش در واقع یک نوع ترد است پس بهتره از همون تایمر استفاده بشه چون آسونتره.
Thread.Sleep(5000); در وافع ترد برنامه اصلی رو به مدت 5 ثانیه معلق میکنه و اگه بخواین ترد t1 معلق کنیید باید از کد زیر استفاده کنید.



t1.Suspend();
t1.Resume();

Mahmoud.Afrad
یک شنبه 29 بهمن 1391, 23:14 عصر
ضمن تشکر از راه حلتون، ولی روش شما هیچ فرقی با استفاده از تایمر نداره چون میزان استفاده ترد از cpu به برنامه اصلی تعلق داده می شه. از طرفی تایمر خودش در واقع یک نوع ترد است پس بهتره از همون تایمر استفاده بشه چون آسونتره.
Thread.Sleep(5000); در وافع ترد برنامه اصلی رو به مدت 5 ثانیه معلق میکنه و اگه بخواین ترد t1 معلق کنیید باید از کد زیر استفاده کنید.



t1.Suspend();
t1.Resume();

بالاخره کاری که ایشون میخوان انجام بدند هم نیاز به پردازش داره و طبیعی هست که میزانی از مصرف cpu رو به خودش اختصاص بده. اگر ایشون کدشون رو قرار بدن بهتر میشه کمک کرد.
در مورد sleep هم باید عرض کنم ، نه ما به ترد اصلی کاری نداریم. اگر دقت کنید تابع رو در ترد دیگری(T1) صدا زدیم و بالطبع Thread.Sleep(5000); در T1 اجرا خواهد شد و T1 به میزان 5 ثانیه تعلیق میشه.