עבור לתוכן

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

Featured Replies

פורסם

יש לי תוכנה שמריצה קבצים מסויימים אחד אחרי השני, כאשר יש הפרש של למעלה משנייה בין קובץ לקובץ אני רושם בתוכנה שהיא מחכה 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 לפני שאתה מפעיל את כל קובץ.

פורסם

ערוך בבקשה את הכותרת כך שתכיל את תמצית השאלה.

פורסם
  • מחבר

הגדרתי את הטיימר ל-1000 מילישניות אבל לא הבנתי על איזה פונקציה דיברת שעלי להירשם אליה ולמה לעשות לטיימר 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 מילישניות) וככה הטיימר כשהוא קורא אותו הוא מקבל את הערך במילישניות מתי הקובץ הבא יגיע.

ארכיון

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

דיונים חדשים