בעיה ב-JAVA

DadleFish

New member
בעיה ב-JAVA

אני צריך למדוד DURATION של פעילות אסינכרונית במערכת רצה (בלי להתחשב בנפילות בין תחילת הפעילות לסופה, נגיד). ב-++C (ב-WIN32API ליתר דיוק) הייתי משתמש במקרה הזה ב-GetTickCount למשל, כדי לבדוק את האינטרוול בין ההתחלה לבין הסיום. העניין הוא שב-JAVA אין לי כזה דבר - כל הזמנים מתייחסים רלטיבית ל-1 לינואר 1970. זה לא טוב, כמובן. עד עכשיו יש לי רק פתרון אחד - thread שמנהל את הסיפור הזה בעצמו (ממש סופר שניות "באמת"), אבל זה לא טוב כי זה לא מספיק מדויק. רעיונות?
 

Zack DA

New member
למה זה מפריע לך ?

יש לך מספיק קלאסים כמו Calendar ו- Date שימירו בשבילך את מה שצריך. אבל אני לא רואה שום סיבה שאפילו את זה תצטרך. הרי אתה רוצה לחשב duration... אם תחסיר את הזמנים בסוף ובהתחלה תקבל את ההפרש במילישניות. מה רע ?
 

DadleFish

New member
אה, שכחתי לומר את זה באמת....

צודק! ומה עם שעון חורף, שעון קיץ, או סתם הזזות שעון? לא טוב.
 

Zack DA

New member
אתה מתבדח ?

כי לא ממש הבנתי אותך, אתה הרי רוצה למדוד duration ועומד לקבל אותו במילי שניות. מה הקשר לשעון חורף ? אתה מפחד שמישהו יעדכן את זמן המערכת בזמן הריצה ?
 

voguemaster

New member
כן, זו הבעיה שלו

הריצה לאו דווקא אורכת מילישניות, ככה ידידנו טוען
 

Zack DA

New member
טוב,

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

DadleFish

New member
לא בדיוק ברור לי,

למה ב-JAVA אין יכולת לספור מילישניות (או שניות, לא ממש משנה) מעליית המערכת. למה ב-C אני יכול לעשות GetTickCount וב-JAVA לא? זה אפילו לא OS-Dependant, והאמת שקשה לי מאוד להאמין שאף אחד לא נתקל בבעיה הזו. אגב, ספציפית, הבעיה היא מציאת זמן של שיחת טלפון בשניות. אם השיחה התחילה ב-23:59 והסתיימה ב-01:01, שתי דקות אח"כ + קפיצת שעה בשעון קיץ - אני אספור את זה כ-62 דקות. זה למה אני "מפחד". שני הפתרונות הקבילים הם באמת thread שסופר בעצמו, או thread שבודק אם היו שינויים גדולים. לדעתי אני איאלץ לעשות פתרון ביניים. thread שסופר בעצמו תוך תיקון לפי שעת המערכת. לא ייאמן ש-JAVA לא מסוגלת לתת לי כלי כזה. הרי לתוכניתני ה-JVM אין דבר יותר פשוט מזה... לא ברור לי.
 

Zack DA

New member
יכול להיות שיש.

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

vinney

Well-known member
תפשט

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

vinney

Well-known member
למה כל שניה?

ואגב, מה קורה אם מעדכנים זמן "אחורה"? פתאום יהיו מרווחים שליליים? באמת מוזר, לא יכול להיות שאין API לזה בJAVA...
 

DadleFish

New member
בעייתי

JNI בהחלט יפתור את הבעיה, אבל לא לכל פלטפורמה (DUH), ולכן עדיף יהיה לי לענות שזה בלתי אפשרי מאשר ליישם את זה באמת.
 

Yoava333

New member
אני לא יודע JAVA

אבל מה הבעיה לעשות כמה פעולות מתמטיות פשוטות: 1. להכניס למשתנה את הזמן של ההתחלה במילישניות ונקרא לו לצורך העניין tm 2.
tm = tm/1000 tm = (לעגל למטה)​
עכשיו יש לך את זמן בשניות מ1970 עכשיו כל שניה אתה עושה פעולת חיסור ומעגל למטה
 
למעלה