PDA

View Full Version : سوال: چک کردن مدام ساعت سیستم



vb-sosol
پنج شنبه 30 آبان 1392, 14:58 عصر
سلام دوستان
میخوام برنامه ای بنویسم که سر ساعت مثلا 10:51:23 یک پیغام بده
اگه از تایمر استفاده کنم و شرطی رو چک کنم که اگه به این زمان رسیدی پیغام رو نشون بده
برنامه خیلی درگیر میشه با cpu
خواستم بدونم راه حلی وجود داره که بتونم بدونم درگیری با cpu اینکار رو انجام بدم؟
اگه میشه توضیح و یا سورس کدی در اختیارم قرار دهید

hamid_hr
پنج شنبه 30 آبان 1392, 15:52 عصر
من يه راهي به نظرم رسيد
مثلا الان ساعت 10
شما ميخواي 10:20 پيغام بده
اختلافش ميشه 20 دقيقه
خب 20 دقيقه رو به ميلي ثانيه تبديل كن و بزار براي interval تايمر
دقيقا 10:20 مياد رويداد تيك تايمر فعال ميشه

vb-sosol
پنج شنبه 30 آبان 1392, 16:11 عصر
من يه راهي به نظرم رسيد
مثلا الان ساعت 10
شما ميخواي 10:20 پيغام بده
اختلافش ميشه 20 دقيقه
خب 20 دقيقه رو به ميلي ثانيه تبديل كن و بزار براي interval تايمر
دقيقا 10:20 مياد رويداد تيك تايمر فعال ميشه

خب اینکه متوجه بشم الان ساعت 10 هست مگه راهی غیر از این وجود داره که شرطم رو بذارم توی یه تایمر؟

nunegandom
پنج شنبه 30 آبان 1392, 16:17 عصر
خوب با Thread یه sleep بده تا اون موقع! دیگه بیشتر از این به ذهن بنده نمیرسه :/

vb-sosol
پنج شنبه 30 آبان 1392, 16:27 عصر
خوب با Thread یه sleep بده تا اون موقع! دیگه بیشتر از این به ذهن بنده نمیرسه :/

یه مثال برام میزنی.اصلا آشنایی ندارم
ضمنا سیستم طوری هست که همیشه روشنه

hamid_hr
پنج شنبه 30 آبان 1392, 17:16 عصر
خب اینکه متوجه بشم الان ساعت 10 هست مگه راهی غیر از این وجود داره که شرطم رو بذارم توی یه تایمر؟
ببين فقط يك بار ميخواد زمان كوك شده رو از زمان هم سيستم كم كني

FastCode
پنج شنبه 30 آبان 1392, 17:49 عصر
Thread.Sleep دقیق نیست.
از System.Threading.Timer استفاده کنید.
برای تغییر ساعت سیستم هم از SystemEvents.TimeChanged استفاده کنید.
برای اینکه دقتتون بالاتر بره هم میتونید مثلا هر بار فقط به اندازه ۹۰٪ زمان تایین شده صبر کنید. وقتی به اندازه کافی نزدیک شدید از Thread.Sleep با اندازه های کوچک استفاده کنید و وقتی خیلی نزدیک شدید یک حلقه for
خاصیت این روش اینه که معمولا درست قبل از اینکه زمان مورد نظرتون برسه فرکانس پردازنده به خاطر مصرف زیاد شما توسط shceduler سیستم عامل بالا میره و عملیات از اول با سرعت بالا شروع میشه.

salehsam
جمعه 01 آذر 1392, 09:41 صبح
سلام ببین این به کارتون میاد


private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = DateTime.Now.ToString("hh:mm");

}

private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text= DateTime.Now.ToString("hh:mm");
}

private void textBox1_TextChanged(object sender, EventArgs e)
{

if (textBox1.Text == textBox2.Text)
{
MessageBox.Show("ok");
}

تایمر بر روی 60000 ست شده و روی true قرار دارد

vb-sosol
جمعه 01 آذر 1392, 10:13 صبح
Thread.Sleep دقیق نیست.
از System.Threading.Timer استفاده کنید.
برای تغییر ساعت سیستم هم از SystemEvents.TimeChanged استفاده کنید.
برای اینکه دقتتون بالاتر بره هم میتونید مثلا هر بار فقط به اندازه ۹۰٪ زمان تایین شده صبر کنید. وقتی به اندازه کافی نزدیک شدید از Thread.Sleep با اندازه های کوچک استفاده کنید و وقتی خیلی نزدیک شدید یک حلقه for
خاصیت این روش اینه که معمولا درست قبل از اینکه زمان مورد نظرتون برسه فرکانس پردازنده به خاطر مصرف زیاد شما توسط shceduler سیستم عامل بالا میره و عملیات از اول با سرعت بالا شروع میشه.

اگه امکانش هست یه سورس در این زمینه برام بذارید
با Thread کار نکردم
ممنون میشم

vb-sosol
جمعه 01 آذر 1392, 10:15 صبح
سلام ببین این به کارتون میاد


private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = DateTime.Now.ToString("hh:mm");

}

private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text= DateTime.Now.ToString("hh:mm");
}

private void textBox1_TextChanged(object sender, EventArgs e)
{

if (textBox1.Text == textBox2.Text)
{
MessageBox.Show("ok");
}

تایمر بر روی 60000 ست شده و روی true قرار دارد


دقیق نیس!......

salehsam
جمعه 01 آذر 1392, 14:34 عصر
میتونین تایمر رو روی 1000 قرار بدین تا دقیق بشه!

vb-sosol
جمعه 01 آذر 1392, 22:37 عصر
میتونین تایمر رو روی 1000 قرار بدین تا دقیق بشه!

دوست عزیز مشکل من با تایمر هست
کل cpu رو گیره !!!

alonmahdi
شنبه 02 آذر 1392, 11:50 صبح
سلام با ترد باید چنین کاری رو بکنی

private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(CheckTime));
t.Start();

}

و این هم متدی که توی اون کاری رو که می خوای انجام بدی رو بگذار

public void CheckTime()
{
while (true)
{
DateTime Dt = DateTime.Now;
if (Dt.Hour == 12 && Dt.Minute == 28 && Dt.Second == 00)
MessageBox.Show("salame");
Thread.Sleep(1000);
}


}


موفق باشید:لبخندساده: