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

ככלל, יש לחלק את ההתייחסות לנושא זה ל-2 חלקים:
1. טיפול במקרה כזה של טעינת חומר רב אל פקדים (כגון Combobox, Listbox או Datagrid) בתוכנית חלונאית.
2. טיפול במקרה כזה של טעינת חומר רב אל פקדים (כגון Combobox, Listbox או Datagrid) בתוכנית מבוססת דפדפן (למשל ASP.Net).

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

טעינת חומר רב לפקדים בתוכנית חלונאית
לנושא זה, כמו לנושאים רבים אחרים, אין פיתרון קסם שמתאים לשימוש בכל מצב ובכל סיטואציה, על מנת למצוא את הפתרון המתאים ביותר, חשוב שתענה לעצמך על השאלות הבאות:
1. האם על מנת לבחור ערך המשתמש יצטרך לראות את כל הרשימה?
2. כמה משתמשים צפויים להשתמש במערכת במקביל?
3. האם כל משתמש שנכנס למערכת אמור לראות את אותם הנתונים ב-ComboBox?
4. מהי תדירות השינויים המבוצעים בתכנים שב-Combobox?
5. האם מדובר ב-Combobox אשר אליו המשתמש נכנס יותר מפעם אחת בתהליכי עבודתו, ז"א האם קיים סיכוי סביר שהוא יידרש לצפות בתוכנה מספר פעמים בפרק זמן קצר יחסית?
6. האם מדובר בנתונים ממויינים או שניתן למיינם לפי סדר מסוים?

כעת, משענית לעצמך על שאלות אלו, תוכל לתפור לך את הפתרון המתאים, כעקרון, הרעיון המרכזי הוא להעביר את הלולאה האחראית לטעינת הפקד (Control) ל-Thread נפרד אשר יבצע את טעינת הנתונים לפקד (חשוב לשים לב שרק ה-Thread שיצר את הפקד מורשה לטעון אותו בנתונים ולכן הוא יבצע את טעינת הנתונים בפועל), כמו כן, במידה ומדובר בסיטואציה שבה המשתמש אינו נדרש במרבית הפעמים לצפות בכל הנתונים שב-Combobox על מנת להגיע להחלטה לגבי הפריט שייבחר, ניתן לייעל במידה רבה את התהליך כך שנתונים יימשכו דף אחר דף בהתאם לביצוע ה-Scrolling כך שעם הפעלת האפליקציה היא תמשוך את 2 הדפים הראשונים ובעת גלילה מלאה של דף אחד מתוכם תמשוך את 2 הבאים. בכל אופן חשוב לדעת שבעבודה ב-Multithreading באפליקציות GUI מחייבת הקפדה על מספר דגשים, לפירוט תוכל לעיין בפוסט הזה.

השאר תגובה