צריך עזרה קטנה עם Timer ב-C# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

צריך עזרה קטנה עם Timer ב-C#


gshhar

Recommended Posts

יש לי תוכנה שמריצה קבצים מסויימים אחד אחרי השני, כאשר יש הפרש של למעלה משנייה בין קובץ לקובץ אני רושם בתוכנה שהיא מחכה X שניות לקובץ הבא, מה שאני רוצה לעשות זה שאם למשל התוכנה רושמת לי כמו שהיא רושמת עכשיו "waiting for the next file ...X sec" אז שהיא תספור אחורה כל שנייה למשל אם התוכנה מחכה 4 שניות אז בעזרת טיימר לאחר שנייה זה ירד ל-3 וכד'.

זו המתודה שלי שבעצם נכנסת ל-if מתי שהקובץ הבא יגיע אחרי למעלה משנייה (המתודה הזו בעצם נמצאת בתוך פונקציה שדוגמת את האובייקט שלי שמריץ את הקבצים ופועלת בהתאם אם פרופרטי מסויים השתנה) ואז אני רוצה שהטיימר יופעל כאשר המשתנה fileData.nextFile הוא int והוא בעצם אומר בעוד כמה שניות הקובץ הבא יופיע, ניסיתי לעשות את זה עם טיימר אבל לא הלך לי, כרגע כמו שאתם רואים התוכנה רושמת מתי יופיע הקובץ הבא אבל ללא כל ספירה אחורה (זה WinForm והמשתנה נכנס ללייבל)


if (fileData.messages == true)
{
LabelStatus.Text = "Waiting for next file... " +
"(" + (fileData.nextFile) / 1000 + " sec)";
}

קישור לתוכן
שתף באתרים אחרים

אתה מוסיף קונטרול טיימר.

קובע את ה-interval שלו ל-1000 (מילישניות).

נרשם לאוונט שלו ושם בו קריאה לפונקציה שמעדכנת את הלייבל. בפונק הזאת אתה גם מוריד שנייה מ-fileData.nextFile

בכל פעם ומציג.

לטיימר יש מתודות start ו-stop

אתה קורא ל-stop ומיד ל-start לפני שאתה מפעיל את כל קובץ.

קישור לתוכן
שתף באתרים אחרים

האם את הפונקציה שלי שתקבל מספר ובכל פעם שהטיימר יופעל (כל שנייה) אני צריך לכתוב בתוך האבנט של הטיימר שנוצר לי ?

אני מתכוון לאבנט הזה:


private void timer1_Tick(object sender, EventArgs e)
{

}

קישור לתוכן
שתף באתרים אחרים

השאלה שלי היא איפה אני אמור לרשום את המתודה שעושה מה שעושה, האם לכתוב Class חדש או לרשום את זה בתוך האבנט שנוצר לי כשהוספתי את הטיימר לתוכנית, ז"א פה:


private void timer1_Tick(object sender, EventArgs e)
{

}

קישור לתוכן
שתף באתרים אחרים

האם את הפונקציה שלי שתקבל מספר ובכל פעם שהטיימר יופעל (כל שנייה) אני צריך לכתוב בתוך האבנט של הטיימר שנוצר לי ?

אני מתכוון לאבנט הזה:


private void timer1_Tick(object sender, EventArgs e)
{

}

את הקוד הזה קיבלת כשלחצת פעמיים על עצם ה Timer שלך?

אם כן, אתה יכול לכתוב בו את הקוד שאתה רוצה להפעיל - והוא כבר רשום ל Event בשבילך.

קישור לתוכן
שתף באתרים אחרים

כן, את הקוד הזה קיבלתי כשלחצתי פעמיים על הטיימר.אוקיי אבל הבעיה שלי היא כזאת:

זו המתודה שלי שאליה אני נכנס אם הקובץ הבא יגיע בהפרש של למעלה משנייה ואז אני רוצה שהטיימר יכנס לפעולה ויספור אחורה:


if (progress.messages == true)
{
double nextFilet = progress.nextFilet;
LabelStatus.Text = "Waiting for next packet... " + "(" + (nextFilet) / 1000 + " sec)";
}

המשתנה nextFilet בעצם אומר מתי יגיע הקובץ הבא ואותו אני צריך נראה לי לשלוח לטיימר שיתחיל לספור אחורה ז"א אם בכניסה למתודה הוא 3.5 ז"א בעוד 3.5 שניות יגיע הקובץ הבא אז אני רוצה שהטיימר יספור 3.5 ויציג את זה בלייבל ואחרי שנייה 2.5 ויציג ואחרי שנייה 1.5 ואז 0.5 ואז כמובן התוכנית ממשיכה.

איך אני עושה את זה ?

קישור לתוכן
שתף באתרים אחרים

כמו שזה נראה, אתה צריך להעתיק את הקוד ששמת כאן, למתודה שקיבלת כשלחצת פעמיים כל הTimer.

בכל מקרה - אם אתה רוצה לייצר הפרדת ממשק-מימוש, אתה יכול לדאוג שהמתודה של הטיימר קוראת למתודה שאתה כתבת, שהתוכן שלה הוא:

 if (progress.messages == true)
{
double nextFilet = progress.nextFilet;
LabelStatus.Text = "Waiting for next packet... " + "(" + (nextFilet) / 1000 + " sec)";
}

קישור לתוכן
שתף באתרים אחרים

מה שעשיתי זה זה:


if (progress.messages == true)
{
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Start();
double nextFile = progress.nextPacket;
}

ובטיימר עצמו אני מציג מה שאני רוצה.

עכשיו הבעיה שלי היא איך אני יכול להעביר לטיימר מספר מסויים ככה שכל שניה יוריד ממנו 1 ויציג אותו בלייבל ? (המשתנה nextFile)

קישור לתוכן
שתף באתרים אחרים

טוב עשיתי משהו אבל כרגע הספירה אחורה לא מוצגת בלייבל


public void timer1_Tick(object sender, EventArgs e)
{
if (groupBoxSelect.Enabled == false)
{
if (nextFileDelay != null)
{
double delayForFile = nextFileDelay.nextFileIn;


if (delayForPacket > 1)
{
labelStatus.Text = "Waiting for next file... " + "(" + (delayForPacket) + " milliseconds)";
}
else
{
timer1.Stop();
}


delayForFile--;
}
}
}

nextFileDelay זה אובייקט שלו יש 2 פרופרטיס:

1. nextFileDelay זה פרופרטי מסוג bool שבעצם משתנה ל-true אם הקובץ הבא יגיע בעוד למעלה משנייה וככה אני נכנס לטיימר

2. nextFileIn - מסוג דבל (הוא סטטי) וככה כשהקובץ הבא יגיע בעוד למעלה משנייה אני מכניס אליו את הערך (למשל 2000 מילישניות) וככה הטיימר כשהוא קורא אותו הוא מקבל את הערך במילישניות מתי הקובץ הבא יגיע.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...