אנימציה מקוטעת של progress bar י(C#) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


Jaman

Recommended Posts

כתבתי תוכנית די פשוטה להעתקת קבצים ב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 מתבצע, התוכנית בהשעייה.

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

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

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

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

עדכון 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 שומר קובץ, אבל בתיקיה של המשתמש).

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

ארכיון

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

×
  • צור חדש...