PDA

View Full Version : thread همیشه در حال اجرا



negar.rafie
چهارشنبه 08 مرداد 1393, 12:55 عصر
سلام
من میخوام یه سری اطلاعات را به نرم افزار بدم که این اطلاعات مدام تغییر میکنند
حالا نمیخوم از تایمر استفاده کنم
مثلا در کد زیر ثانیه را می خوام مدام با ترید روی فرم نمایش بدم ولی فقط یکبار اجر میشه و متوقف میشه
حالا باید چکار کنیم تا ترید مدام در حال اجرا باشه تا قبل از اینکه متوقف بشه

Thread p1;
private void Form1_Load(object sender, EventArgs e)
{
p1 = new Thread(ff);
p1.Start();
}
private void ff()
{

this.Invoke(new Action(() =>
{
this.Text = DateTime.Now.Second.ToString ();
}));

}

abbas.oveissi
چهارشنبه 08 مرداد 1393, 16:23 عصر
توی تابع ff یک While بذارید که شرط آن همیشه True باشد.از Thread.Sleep هم میتونید بین هم بار که While میخواد بره از اول تکرار بشه وقفه بندازید.

negar.rafie
چهارشنبه 08 مرداد 1393, 17:37 عصر
این کار استاندارد نیست
باید راه حرفه ای تری باشه
با این کار پرفرمنس برنامه میره بالا

abbas.oveissi
چهارشنبه 08 مرداد 1393, 17:54 عصر
شما گفتید استاندارد نیست،من یک نگاه توی stackoverflow انداختم که یکی گفته بود این روشی هست که اصولا استفاده میشه.
لینک :http://stackoverflow.com/questions/1281745/is-while-true-usually-used-for-a-permanent-thread
حالا شاید کس دیگه اومد راه بهتر پیشنهاد کرد و منم یادگرفتم

felfely
چهارشنبه 08 مرداد 1393, 19:37 عصر
سلام.
من یه ارسال و دریافت میل گرافیکی نوشته بودم تو سی شارپ، چون هر لحظه باید منتظر رسیدن داده جدید بود به همین دلیل از while تو thread استفاده کردم.
راه حرفه ای تری سراغ دارم که تو Qt استفاده میشه نه سی شارپ.
اسمش هست: Signal - Slot
کارش اینه که تابع ff رو وصل می کنیم به یه سیگنالی که فرستاده میشه. فقط هر وقت اون سیگنال فرستاده شد تابع ff شما اجرا میشه. بر اساس اون چیزی که تو پست اوّل فرمودید، شما می تونید سیگنال رو وقتی ارسال کنید که داده ای برای تغییر دادن داشته باشید.
فقط ببینید تو سی شارپ معادلش چی میشه.

hamid_hr
پنج شنبه 09 مرداد 1393, 19:00 عصر
خب شما مجبورین از یه حلقه بینهایت استفاده کنین
حالا اینجا میخواین ثانیه نشون بدین بیاین داخل حلقه اینو بنویسین
Thread.Sleep(1000);
اینطوری هر بار اجرا 1000 میلی ثانیه صبر میکنه بعد میره دوباره ساعتو آپدیت میکنه

negar.rafie
جمعه 10 مرداد 1393, 02:15 صبح
ممنون فقط این روش استاندارد هست؟
و راه دیگه ای نیست؟

abbas.oveissi
جمعه 10 مرداد 1393, 02:29 صبح
ممنون فقط این روش استاندارد هست؟
و راه دیگه ای نیست؟
اگر قراره بصورت پشت سر هم و متناوب مثلا هر ثانیه تکرار بشه،فکر نکنم روش دیگه ای پیدا کنید.همون حلقه While رو بذارید و با Sleep.Timer کارتون رو راه بندازید.
اگر بعد نیاز به تکرار هست اما متناوب نیست،حلقه While رو بذارید ولی میتونید از WaitOne و Set به جای Sleep.Timer استفاده کنید تا بتونید هر زمان که نیاز دارید با یک سیگنال ترد را دوباره به حالت اجرا ببرید.

Mahmoud.Afrad
جمعه 10 مرداد 1393, 05:19 صبح
برای مثالی که در پست اول زدید و کارهایی که هر چند ثانیه باید انجام بگیرند، بله بایست توسط تایمر یا ترد هر چند ثانیه متد رو اجرا کنید. البته برای اینکار در ترد نیاز به حلقه و sleep دارید.
اما برای دریافت داده از دیتابیس در صورت تغییر در اطلاعات از SqlDependency میتونید استفاده کنید.
اگر مشخص کنید چه کاری میبایست انجام بشه ، میشه انتخاب بهتری داشت.

negar.rafie
جمعه 10 مرداد 1393, 11:30 صبح
برای مثالی که در پست اول زدید و کارهایی که هر چند ثانیه باید انجام بگیرند، بله بایست توسط تایمر یا ترد هر چند ثانیه متد رو اجرا کنید. البته برای اینکار در ترد نیاز به حلقه و sleep دارید.
اما برای دریافت داده از دیتابیس در صورت تغییر در اطلاعات از SqlDependency میتونید استفاده کنید.
اگر مشخص کنید چه کاری میبایست انجام بشه ، میشه انتخاب بهتری داشت.
فرض کنید میخوایم یه برنامه بنویسیم که میخواد پیامک هایی که به پنل پیامک ارسال میشه را به صورت مداوم دریافت کند؟
یا مثلا چک کند هر وقت کامپیوتر به اینترنت متصل شد یه کاری بکند
و کاریی از این قبیل
حالا ما میخوایم برناممون وقتی اجرا شد مدام چک کنه
و از همه مهم تر شاید برناممون به مدت طولی مثلا یک ماه در حال اجرا بود
چه کار کنیم که برنامه با مشکل مواجه نشه

hamid_hr
جمعه 10 مرداد 1393, 11:35 صبح
خب برا اين كارها كه نميخواد هر ثانيه يك بار انجام بدي
اولا بايد بگردي ببيني براش ايونت نمبتوني پيدا كني
اگر نبود از اين روش بايد اتفاده مني اونم يه وفقه 10 ثانيه اي بايد بزاري براش

mz6488
جمعه 10 مرداد 1393, 11:45 صبح
اینکه بیایم از Thread.Sleep استفاده کنیم یا تایمری که هر 1 ثانیه اجرا بشه فرقی هم میکنه؟

tooraj_azizi_1035
شنبه 11 مرداد 1393, 10:24 صبح
سلام
عزیزم شما باید از کلاس Threading.Timer استفاده کنی:

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();
}
}
}

negar.rafie
یک شنبه 12 مرداد 1393, 10:33 صبح
تفاوت thread با Threading.Timer در چیست؟
در چه جایی از Threading.Timer و در چه جایی باید از Threading استفاده کنیم؟
مثلا برای چک کردن مداوم پنل پیامک و مشاهده پیامکهای دریافتی هم باید از این روش استفاده کنیم؟