View Full Version : سوال: نشان دادن زمان باقیمانده برای تایمر
  
zhr.rezae66i
دوشنبه 07 مرداد 1392, 14:53 عصر
سلام من یک تایمر دارم که هر 10 ثانیه ی عملیو انجام میده 
حالا میخام این شمارنده رو روی صفحم داشته باشم
این ی برنامه تحت ویندوز هست با سی شارپ
چطوری یک label رو هر ثانیه آپدیتش کنم:(
arefba
دوشنبه 07 مرداد 1392, 15: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, 15: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, 16:12 عصر
اتفاقا روش شما هم به ذهنم رسید اما منابع بیشتری از سیستم رو میگیره و دو thread  رو فعال می کنه
zhr.rezae66i
چهارشنبه 09 مرداد 1392, 09: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, 10:53 صبح
خب خودم قبله اون دستور نوشتم
if(invokerequered) درست شد
ممنون از همه دوستان
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.