PDA

View Full Version : سوال: نشان دادن زمان باقیمانده برای تایمر



zhr.rezae66i
دوشنبه 07 مرداد 1392, 13:53 عصر
سلام من یک تایمر دارم که هر 10 ثانیه ی عملیو انجام میده
حالا میخام این شمارنده رو روی صفحم داشته باشم
این ی برنامه تحت ویندوز هست با سی شارپ
چطوری یک label رو هر ثانیه آپدیتش کنم:(

arefba
دوشنبه 07 مرداد 1392, 14:13 عصر
چه عکس زیبایی به به
خوب دو روش هست یکی اصولی و یکی من درآوردی
اول من درآوردی رو میگم
یک تایمر میسازید و اینتر ولش رو میزارید روی یک ثانیه بعد از اون یک متغیر int تعریف میکنید و اون رو برابر با 0 قرار میدیدی توی رویداد تایمر تیک مینویسید که اگه اون متغیر مساوی ده هست اونوقت
بیاد تون عملی رو که میخواید انجام بده اینم کدش

int ii = 0;
private void timer2_Tick(object sender, EventArgs e)
{
if (ii == 10)
{
// عملی که میخواهید بعد از 10 ثانیه انجام شود
MessageBox.Show("Test");
ii = 0;
}
++ii;
label1.Text = ii.ToString() ;

}
و روش درست اینه که بیاین از کلاس تایمر ارث بری کنید و هر بلایی دوست دارین سرش بیارید و ازش استفاده کنید مثلا بلایی که شما دوست دارین سرش بیارید میشه این

public class TimerPlus : IDisposable
{
private readonly TimerCallback _realCallback;
private readonly Timer _timer;
private TimeSpan _period;
private DateTime _next;

public TimerPlus(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period)
{
_timer = new Timer(Callback, state, dueTime, period);
_realCallback = callback;
_period = period;
_next = DateTime.Now.Add(dueTime);
}

private void Callback(object state)
{
_next = DateTime.Now.Add(_period);
_realCallback(state);
}

public TimeSpan Period
{
get
{
return _period;
}
}

public DateTime Next
{
get
{
return _next;
}
}

public TimeSpan DueTime
{
get
{
return _next - DateTime.Now;
}
}

public bool Change(TimeSpan dueTime, TimeSpan period)
{
_period = period;
_next = DateTime.Now.Add(dueTime);
return _timer.Change(dueTime, period);
}

public void Dispose()
{
_timer.Dispose();
}
}

farhad.k.t
دوشنبه 07 مرداد 1392, 14:26 عصر
تاجایی که من میدونم...
یک تایمر دیگه addکن بعد intervalرا برابر 1000 قرار بده بعد خاصیت text لیبل مذکور را برابر10 قرار بده و کد زیر را در eventتیک تایمرت قرار بده.
Private void timer_tick(object sender , EventArgs e)
{

if (label1.text=="10")
int a=10;

a--;
label1.text=a.tostring();
if(label1.text=="0")
a=10;
}

arefba
دوشنبه 07 مرداد 1392, 15:12 عصر
اتفاقا روش شما هم به ذهنم رسید اما منابع بیشتری از سیستم رو میگیره و دو thread رو فعال می کنه

zhr.rezae66i
چهارشنبه 09 مرداد 1392, 08:28 صبح
دوستان خوبم به این خط خطا میگیره
label1.Text = ii.ToString() ;
و خطاش اینه
Cross-thread operation not valid: Control 'TimeRemainig' accessed from a thread other than the thread it was created on.
و من سرچ زدم دیدم برای اینکه در ترد بخام متن label رو تغییر بدم باید از دستور زیر استفاده کنم

TimeRemainig.Invoke(new MethodInvoker(delegate { TimeRemainig.Text = ii.ToString(); }));

و این مشکلی نداره و کار میکنه اما وقتی دستی برنامه رو میبندم اخرش این خطا رو میده

Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
این برنامه باید همیشه روی سرور ران باشه میترسم مشکلی پیش بیاد

میتونید راهنماییم کنید لطفا

zhr.rezae66i
چهارشنبه 09 مرداد 1392, 09:53 صبح
خب خودم قبله اون دستور نوشتم
if(invokerequered) درست شد
ممنون از همه دوستان