הכוונה היא למצב בו שני דברים קורים במקביל בתוך האפליקציה, ולא ברור מי מהם יסיים ראשון ומי שני, ושניהם קריטיים באותה נקודה בזמן ריצת האפליקציה.
הרבה פעמים, כשלא רואים את המצב הזה מגלים אותו בזמן בדיקות או יותר גרוע אחרי שהפיתוח הסתיים, מה שמוביל לבאג. באגים מסוג זה לא תמיד הכי פשוטים למציאה, אולם ברגע שהם נמצאים הם לא קשים לתיקון. לרוב מדובר בשתי פעולות שהן א-סינכרוניות (עיין ערך א-סינכרוני)
דוגמה לבעיה כזו - האפליקציה צריכה לטעון את הסקין שלה, וגם XML, ובשביל לחסוך זמן - הן נקראות יחד בתחילת האפליקציה ולא אחת אחרי השניה.
מה לא לעשות ?
אסור להניח שקובץ אחד יגיע יותר מהר כי הוא יותר קטן, או כי הוא מגיע משרת יותר קרוב או אפילו מאותו מיקום של הswf. ההנחות האלו גורמות לבעיות קשות ולעיתים נדירות (מה שמקשה על מציאתן)
מה כן עושים ?
מתוך הנחה ששתי הטעינות מקבלות פונקצית סיום כל אחת, ושאנו זקוקים לשתיהן בשביל האפליקציה. מה שקורה הוא שמייצרים פונקציה מיוחדת של הכניסה לאפליקציה, וששתי הפונקציות קוראות לה. כל אחת מפונקציות הטעינה מרימה flag שאומר "אני סיימתי" ומייד אחרי כן קוראת לפונקציית הכניסה. פונקציית הכניסה תמשיך את האפליקציה אם, ורק אם היא מזהה ששני הדגלונים דולקים. בעצם מה שקורה הוא שהפונקציה הראשונה של הסיום מדווחת "אני סיימתי, בדוק אם גם השניה סיימה" והפונקציה שסיימה שניה מבצעת את אותה הבדיקה. מי שבפועל תצליח זו תמיד הפונקציה השניה.
טיפה מבלבל - אולי קוד יעזור
Using actionscript3 Syntax Highlighting
private var xmlLoaded:Boolean = false;
private var skinLoaded:Boolean = false;
// Assuming that both loaders were called at the same time...
//xml file loaded successfully
private function onXmlLoaded(evt:Event):void
{
xmlLoaded = true;
checkIfBothLoaded();
}
//skin file loaded successfully
private function onSkinLoaded(evt:Event):void
{
skinLoaded = true;
checkIfBothLoaded();
}
//check if both loadings are done
private function checkIfBothLoaded():void
{
//call the startApplication only if both files were loaded
if(xmlLoaded && skinLoaded)
{
startApplication();
}
}
private var skinLoaded:Boolean = false;
// Assuming that both loaders were called at the same time...
//xml file loaded successfully
private function onXmlLoaded(evt:Event):void
{
xmlLoaded = true;
checkIfBothLoaded();
}
//skin file loaded successfully
private function onSkinLoaded(evt:Event):void
{
skinLoaded = true;
checkIfBothLoaded();
}
//check if both loadings are done
private function checkIfBothLoaded():void
{
//call the startApplication only if both files were loaded
if(xmlLoaded && skinLoaded)
{
startApplication();
}
}
Parsed in 0.031 seconds, using GeSHi 1.0.8.4


חדשות