race condition [מתקדם]

פורום זה יאגד בתוכו מאמרים ומדריכים בנושאים השונים שיכתבו על ידי חברי הקהילה. המאמרים יקבלו תיוג מילות מפתח, דירוג רמת קושי ודירוג הקהילה. תוכלו למצוא פה מדריך פלאש, ActionScript, MXML, מאמר בנושא תלת מימד, עיצוב, צד שרת וגם Mobile.

race condition [מתקדם]

הודעהעל ידי איתן אבגיל ב 13 יוני 2010, 19:55

המונח לא יחודי דווקא ל AS אלא הוא יותר כללי מעולם התוכנה.

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

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

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

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

טיפה מבלבל - אולי קוד יעזור
Syntax: [ Download ] [ Hide ]
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();
  }

}


 
Parsed in 0.031 seconds, using GeSHi 1.0.8.4
סמל אישי של המשתמש
איתן אבגיל
Site Admin
 
הודעות: 256
הצטרף: 09 מרץ 2010, 22:10
מיקום: דינאמי = רחובות רמת-גן

Re: race condition [מתקדם]

הודעהעל ידי atarsh ב 20 יולי 2010, 20:23

אני בד"כ עושה את זה עם דגלון אחד, כשאותה פונקציה נקראת בסיום שתי הטעינות:
Syntax: [ Download ] [ Hide ]
Using actionscript3 Syntax Highlighting
private var flag:Boolean = false;

private function onLoad(e:Event):void {
  if (flag) {
    // start app
  }
  else {
    flag = true;
  }
}

 
Parsed in 0.029 seconds, using GeSHi 1.0.8.4

הקריאה הראשונה לפונקציה כשהחלק הראשון ייטען לא תכנס לתנאי (כי הדגלון false) ואז תהפוך את הדגלון ל-true, בקריאה השניה הדגלון יהיה true והאפליקציה מוכנה לרוץ.
סמל אישי של המשתמש
atarsh
 
הודעות: 1310
הצטרף: 11 מרץ 2010, 09:02
מיקום: איפשהו.. around.

Re: race condition [מתקדם]

הודעהעל ידי janiv ב 20 יולי 2010, 21:20

ואם טוענים 40 פריטים?
ככלל אני נמנע מדגלים.. במקרה המתואר יש להוסיף מתודה או מחלקת ניהול.


Syntax: [ Download ] [ Hide ]
Using actionscript3 Syntax Highlighting
var itemCount:int =40;

function loadItems(){
         var request:URLRequest = new URLRequest("xmlFile.xml");
     var loaderXml:URLLoader = new URLLoader();
     loaderXml.load(request);
     loaderXml.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
     loaderXml.addEventListener(Event.COMPLETE, loaderCompleteHandler);
         var otherLoader:Loader =new Loader();
         ...
         ...
}

function loaderCompleteHandler(evt:Event):void {
      //dostuff
          notifyLoaded();      
}
function notifyLoaded(){
        itemCount--;
        if(itemCount==0){
                dispatchEvent("DAVID_LOADED");
        }
}
function errorHandler(evt:IOErrorEvent):void{
        //do stuff or not
        dispatchEvent("DAVID_LOAD_ERROR");
}

 
Parsed in 0.033 seconds, using GeSHi 1.0.8.4
סמל אישי של המשתמש
janiv
 
הודעות: 68
הצטרף: 13 מרץ 2010, 20:19


חזור אל מאמרים ומדריכים לפלאש ומעבר

 


  • שרשורים בנושאים דומים
    תגובות
    צפיות
    הודעה אחרונה

מי מחובר

משתמשים הגולשים בפורום זה: אין משתמשים רשומים ו 2 אורחים