PDA

View Full Version : سوال: راهنمایی برای انتخاب Timer یا Thread جهت انجام یک سری کار در هر 1 دقیقه



Hadi-Hashemi
جمعه 19 تیر 1394, 21:36 عصر
سلام دوستان

میخوام برنامه هر یک دقیقه یکبار بره ایمیل رو چک کنه و اگر ایمیل جدید اومده بود یه بایتی رو به پورت سریال بفرسته.

حالا برای اینکار ( تکرار زمان ) از Timer استفاده کنم بهتره یا از Threadها؟ یا فرقی نداره؟

من از Timer استفاده کردم ولی احساس میکنم تو اون لحظه ( موقعی که داره دستورهای داخل Timer رو اجرا میکنه ) برنامه موقتاً هنگ میکنه. چون تو اون لحظه اشاره گر Mouse وایمیسته و یا وقتی روی منو ها حرکت میکنم برنامه مکث میکنه.




البته اگه راه بهتری هست بفرمایین. :لبخندساده:

با تشکر

NasimBamdad
جمعه 19 تیر 1394, 22:37 عصر
از Thread استفاده کن

MehdiElexal
شنبه 20 تیر 1394, 00:20 صبح
چرا از بک گراند وورکر استفاده نمیکنید ؟ اگر مشکل هنگی دارید و نمیخوایید هنگ داشته باشید از بک گراند ورکر ترجیها استفاده کنید اگر تمایل نداشتید ترد استفاده کنید

Hadi-Hashemi
شنبه 20 تیر 1394, 01:43 صبح
این گراند وورکر چی هست؟ من الان اسمشو شنیدم :خجالت:

tooraj_azizi_1035
شنبه 20 تیر 1394, 10:49 صبح
The timer class:


using System;
using System.Threading;


class TimerExample
{
static void Main()
{
// Create an event to signal the timeout count threshold in the
// timer callback.
AutoResetEvent autoEvent = new AutoResetEvent(false);


StatusChecker statusChecker = new StatusChecker(10);


// Create an inferred delegate that invokes methods for the timer.
TimerCallback tcb = statusChecker.CheckStatus;


// Create a timer that signals the delegate to invoke
// CheckStatus after one second, and every 1/4 second
// thereafter.
Console.WriteLine("{0} Creating timer.\n",
DateTime.Now.ToString("h:mm:ss.fff"));
Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250);


// When autoEvent signals, change the period to every
// 1/2 second.
autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period.\n");


// When autoEvent signals the second time, dispose of
// the timer.
autoEvent.WaitOne(5000, false);
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}


class StatusChecker
{
private int invokeCount;
private int maxCount;


public StatusChecker(int count)
{
invokeCount = 0;
maxCount = count;
}


// This method is called by the timer delegate.
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
Console.WriteLine("{0} Checking status {1,2}.",
DateTime.Now.ToString("h:mm:ss.fff"),
(++invokeCount).ToString());


if(invokeCount == maxCount)
{
// Reset the counter and signal Main.
invokeCount = 0;
autoEvent.Set();
}
}
}

محمد رضا فاتحی
شنبه 20 تیر 1394, 11:12 صبح
این گراند وورکر چی هست؟ من الان اسمشو شنیدم :خجالت:

یکی از کنترل های .net که امکان استفاده از کد ها رو در زمینه فراهم میکنه... می شه بگی همون استفاده از thread ولی ساده تر....
شما کد های مورد نظرتون رو داخل ایونت dowork این کنترل می نویسید ودر لحظه مورد نیازتون بوسیله متد RunWorkerAsync اجراش فراخوانی میشه

khokhan
شنبه 20 تیر 1394, 12:25 عصر
سلام دوستان

میخوام برنامه هر یک دقیقه یکبار بره ایمیل رو چک کنه و اگر ایمیل جدید اومده بود یه بایتی رو به پورت سریال بفرسته.

حالا برای اینکار ( تکرار زمان ) از Timer استفاده کنم بهتره یا از Threadها؟ یا فرقی نداره؟

من از Timer استفاده کردم ولی احساس میکنم تو اون لحظه ( موقعی که داره دستورهای داخل Timer رو اجرا میکنه ) برنامه موقتاً هنگ میکنه. چون تو اون لحظه اشاره گر Mouse وایمیسته و یا وقتی روی منو ها حرکت میکنم برنامه مکث میکنه.




البته اگه راه بهتری هست بفرمایین. :لبخندساده:

با تشکر


DateTime endTime = DateTime.Now.AddMinutes(10);

while(endTime < DateTime.Now)
{
// یه کاری بکن
}

Hadi-Hashemi
شنبه 20 تیر 1394, 15:20 عصر
از همه دوستان بخاطر جواب مفیدشون تشکر میکنم.

فعلا استفاده از Thread رو انتخاب کردم و کار خوب پیش میره و مشکلات هنگ و مکث حل شده.

حالا یه سوال مهم دارم. من اگه بخوام Threadی که Strat کردم رو Stop کنم باید چیکار کنم؟

چیزی مثل ()myThread.Stop نیست. آیا اسمش یه چیز دیگس؟

aliagamon
شنبه 20 تیر 1394, 22:58 عصر
راحت ترین روش برای pause کردن ترد و resume در اینده اینه که تابع رو اینطوری بنویسین:

public void Thread()
{
while (!_Stop)
{
//DO
}
}

بعد هر موقع میخواین متوقق بشه _Stop رو true کنید

SabaSabouhi
یک شنبه 21 تیر 1394, 08:07 صبح
راحت ترین روش برای pause کردن ترد و resume در اینده اینه که تابع رو اینطوری بنویسین:

public void Thread()
{
while (!_Stop)
{
//DO
}
}

بعد هر موقع میخواین متوقق بشه _Stop رو true کنید


سلام
حتماً از یه وقفه ساز مثل Sleep یا روش‌های دیگه توی حلقه استفاده کن، در غیر این صورت cpu time زیادی رو خواهد گرفت.

صبا صبوحی

jamal_ch
یک شنبه 21 تیر 1394, 08:26 صبح
سلام شما باید ایدی thread رو بدست بیاری بعد stop کنید چون thread جدا از خود پروسس برنامه است برای همین بهتره که از یک بک گراند وورکر استفاده کنی کار با هاش خیلی ساده است با یک سرچ کوچیک تو اینترنت نمونه کد زیاد پیدا میشه

Motevalizadeh
یک شنبه 21 تیر 1394, 12:38 عصر
سلام دوستان

میخوام برنامه هر یک دقیقه یکبار بره ایمیل رو چک کنه و اگر ایمیل جدید اومده بود یه بایتی رو به پورت سریال بفرسته.

حالا برای اینکار ( تکرار زمان ) از Timer استفاده کنم بهتره یا از Threadها؟ یا فرقی نداره؟

من از Timer استفاده کردم ولی احساس میکنم تو اون لحظه ( موقعی که داره دستورهای داخل Timer رو اجرا میکنه ) برنامه موقتاً هنگ میکنه. چون تو اون لحظه اشاره گر Mouse وایمیسته و یا وقتی روی منو ها حرکت میکنم برنامه مکث میکنه.




البته اگه راه بهتری هست بفرمایین. :لبخندساده:

با تشکر

timer توی ترد اصلی کار می کنه و تا وقتی کامل کارش رو انجام نده برنامت حالت هنگ بودن رو داری از یه ترد استفاده کن