עבור לתוכן

אנימציה מקוטעת של progress bar י(C#)

Featured Replies

פורסם

כתבתי תוכנית די פשוטה להעתקת קבצים בC# (ב- Win Forms), והוספתי פקד progress bar שיראה את ההתקדמות.

הכל עובד מצויין מלבד זה שהאנימציה של הprogress bar מקוטעת (הוא מתקדם כצפוי, אבל יש את החלק הבהיר שמופיע במחזוריות - הוא לא מתקדם חלק כמו שהוא צריך).

הנה קטע הקוד הרלוונטי:

sizeOfFiles /= 1024; //convert to kilobytes
progressBar.Minimum = 0;
progressBar.Maximum = (int)sizeOfFiles;
progressBar.Value = 0;
foreach (FileInfo file in filesToCopy)
{
lblStatus.Text = "Copying " + file.Name + "...";
Application.DoEvents();
//
// קוד לא רלוונטי
//

string target = Path.Combine(destination.FullName, file.Name);
bool retry;
do
{
retry = false;
try
{
file.CopyTo(target, chkOverwrite.Checked);
}
catch (System.Exception exp)
{
// לא רלוונטי
}
} while (retry);

progressBar.Value += (int)(file.Length / 1024);

}//foreach file

אני מתאר לעצמי שזה בגלל שבזמן ש copyTo מתבצע, התוכנית בהשעייה.

יש דרך פשוטה לגרום לכך שהאנימציה תהיה חלקה?

נ.ב. אני אעלה את התוכנית ואת הקוד שלה אחרי שאפתור את הבעיה הקטנה הזאת.

פורסם

לא כל כך הבנתי את הבעיה שלך מהתיאור, אבל בעקרון הפתרון הוא לדאוג שההעתקה והעדכון של ה-GUI יתבצעו בשני threads נפרדים.

פורסם
  • מחבר

שיערתי שהפתרון יהיה כזה..

אני צריך אבל קודם כל ללמוד קצת על threads לפני שאנסה ליישם את זה :P

פורסם

בהחלט. ליצור ת'רדים זה דווקא לא דבר מסובך, הדבר המורכב הוא לסנכרן ביניהם כהלכה.

פורסם

אכן מדובר בבעיה של תראדים. הסבר מהיר על מה שקורה -

עדכון UI מתרחש רק בקריאה למתודת ה Paint של ה ProgressBar. המתודה הזו נקראת אוטומטית בלולאה שאחראית לטפל בכל האירועים של ה UI.

הבעיה היא שגם העתקת הקבצים מתחילה במקור כאורע של UI ולכן עד שלא יסתיים האירוע לא יטופלו אירועים נוספים.

המלצתי להשתמש ב BackgroundWorker שהופך את העבודה להרבה יותר פשוטה, וחוס את ההסתבכות של עדכון תראד UI מתראד אחר (שאגב לפי הגדרות דוט נט לא מומלץ, ובהרבה מקרים אפילו חסום! ויזרוק שגיאה מתאימה)

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

הייתי צריך להשהות את הפתרון לבעיה לכמה ימים.

קראתי את הפרק של ה Threads בספר ממנו למדתי C# י(Programming C# 3.0 של O'Rielly), אך הוא כמו רוב הנושאים בספר הזה מוסבר בצורה מעפנה לגמרי, לכן אני צריך ללמוד את זה כמו שצריך ממקור אחר.

אשמח לקבל המלצה למקור (ספר / אתר אינטרנט מסויים) טוב ללמוד ממנו על Threads ב C# ו/או C++ (רצוי גם על מחלקות כמו ה background worker, הדוגמה שבMSDN הצליחה קצת לבלבל אותי).

מלבד זאת אני גם רוצה שהאפשרויות של התוכנית (סך הכל 4 משתנים) ישמרו אחרי שתיסגר ויטענו כתיפתח. אני לא רוצה לשמור אותם בקובץ קונפיגוריציה לצד התוכנית, כי אני מעדיף שהתוכנית תהיה קובץ הפעלה עצמאי (עד כמה שאפשר עם .net ...). עד כמה שאני מבין האפשרויות שלי הן שימוש ב Isolated Storage, או ברג'יסטרי של וינדוס. מניסיון שלכם - איזה שיטה מומלצת מבינהן למקרה שלי?

אשמח גם ללינק למקור שמסביר את הנושא הזה היטב (אני לא רוצה לדפוק את הרגי'סטרי של המחשב שלי בטעות :P).

נ.ב. - הוספתי את המקור של התוכנית כמו שהיא עכשיו.

התוכנית מעתיקה קבצים רנדומליים מתיקייה אחת לאחרת ע"פ מגבלה של מקום שמציב המשתמש. התוכנית מיועדת לבחירה רנדומלית של שירים להשמה בנגן המוזיקה (שיש לו מגבלת מקום קטנה מגודל סיפריית המוזיקה של המשתמש). עד שכתבתי את התוכנית הייתי משתמש בתוכנית דומה שפורסמה בשרשור התוכנות המומלצות בפורום תוכנות, ההבדל הוא שההפעלה וההרצה שלה מאוד איטית.

כשאסיים עם התוכנית הזאת אפרסם אותה גם בשרשור התוכנות המומלצות.

[attachment deleted by admin]

פורסם

אין ספר אחד שהוא טוב עבור למידת שפות תכנות.

זרקו לך את המושג background worker? תריץ את זה בגוגל, ותראה מה עולה.

בקשר לבעיה של השמירה, אל תשמור דברים ברגיסטרי.

פשוט תחליט על פורמט של קובץ, ותשמור את המשתנים שלך לתוכו (http://msdn.microsoft.com/en-us/library/system.io.file.aspx)

רק תזכור ליצור מתודה שגם קוראת ממנו.

פורסם
  • מחבר

אמרתי שאני לא רוצה לשמור את המידע בקובץ (conf, ini וכד) לצד התוכנה, כי אני רוצה שיהיה קובץ הפעלה יחיד בלי דברים בלי קבצי עזר לידו (עד כמה שאני מבין ה Isolated Storage שומר קובץ, אבל בתיקיה של המשתמש).

ארכיון

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

דיונים חדשים