תהייה לגבי שפת תכנות וטכנולוגיה

kniaper

New member
תהייה לגבי שפת תכנות וטכנולוגיה

שלום לכולם אני צריך לבנות תוכית מחשב קטנה למחקר בפסיכולוגיה קוגניטיבית שתמדוד באופן מדוייק (סדרי גודל של אלפיות שניה) זמן תגובה של משתמש, ללחיצה על מקש במקלדת נניח. כמו כן התוכנית צריכה להציג סרטוני וידאו קצרים, כאשר כל frame מופיע למשך 100 מילישניות בלבד על המסך לפני שהוא מוחלף בזה שבא אחריו. התזמונים קריטיים, ואני יודע שכתיבה רגילה ושימוש באובייקטים רגילים לא יבטיחו לי דיוק במדידת הזמנים ובהצגת ה-frames למשך הזמן המדוייק שאני בוחר. אשמח לקבל איזה קצה חוט שיסייע לי להתחיל לכתוב דבר כזה. תודה מראש לעונים
 
מה זה "רגיל"? לא הבנתי מה זה "כתיבה רגילה ושימוש באובייקטים רגילים"? אין בעיה בתוכנית ++C/C להגיע לתזמונים כאלו. 100 מילישניות לכל frame זה אומר קצב של 10 פריימים בשניה - אין בעיה ב Windows להציג סרטון גם של 30 פריימים בשניה ויותר. מה שכן, ווינדוס היא לא מערכת real-time, מה שאומר שקשה להבטיח את התזמונים האלו בצורה דטרמיניסטית. אם המחשב יהיה עמוס (המשתמש יחליט להריץ ביחד עם התוכנית שלך עוד מאה תוכנות אחרות שכולן יבצעו כל הזמן גישות לדיסק, למשל) אז התזמונים ייפגעו.
 

kniaper

New member
כתיבה רגילה

בכתיבה רגילה התכוונתי למה שלפחות אני עשיתי עד עכשיו וזה בעיקר בסיסי נתונים. שם, לתזמון יש מעט מאד משמעות אם בכלל. אני למעשה שואל איך אפשר לבנות על XP מערכת דמויית זמן אמת. אני אומר דמוי, כי גם הערכת סטיות בזמנים בדיעבד תתקבל. ובסופו של דבר השאלה המרכזית היא באיזו שפה לבחור למטרה כזו? ובאיזו טכנולוגיה אני אקבל את הביצועים הנדרשים. קראתי על מישהו שעשה דבר דומה עם director של adobe. אבל משום מה נראה לי שתוכנה כזו לא יכולה להבטיח דיוק במדידת הזמנים ובהצגת הסרטונים.
 
זו הגדרה מעניינת לכתיבה רגילה "כתיבה רגילה" == מה שאתה עשית עד היום? במיוחד שלנו אין מושג מה אתה עשית עד היום ומה לא. דרישות הביצועים שלך הן לא כאלו קשות כמו שאולי אתה חושב. אני לא מזמן הייתי צריך לכתוב משהו שהיה חייב להתבצע בתוך מסגרת זמן של 250 מיקרו-שניות (שזה יוצא רבע של מילי-שניה) מאירוע חיצוני מסוים - וכל זה על מעבד שרץ בפחות מ 100 מגהרץ. מה שכן, מדובר היה על חומרה ייעודית ומערכת הפעלה שבנויה למטרה הזו (ללא דיסק קשיח, זיכרונות כולם במהירות המעבד, וכו'). על פנטיום, שחזק בסדרי גודל, לא צריכה להיות לך שום בעיה, אלא אם כן ווינדוס יתערב ויקלקל לך. בכל מקרה, אין בעיה להשיג מדידת ביצועים מאוד מדויקת כדי לדעת בדיעבד מה קרה. אני ממליץ לכתוב את זה ב ++C, ששם יש לך שליטה מקסימלית במה שקורה מסביבך.
 

kniaper

New member
../images/Emo13.gifרק עכשיו שמתי לב לבעיתיות בהגדרה

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

vinney

Well-known member
כמו שאמרו לך, הבעיה היא לא האובייקט

ה"רגיל", אלא מערכת הפעלה. דרישה לתזמון מדויק נקראת "Real Time", ומערכות הפעלה "רגילות" (אלה שמותקנות בבתים ומשרדים, על מחשבי הPC) הן לא מערכות RT. ניתן לפתור את זה בכמה דרכים שונות, התזמונים שלך הם יחסית ענקיים, ולכן אפשר עקרונית לעשות את זה גם בלי הסתמכות על יכולות הRT של מערכת ההפעלה, אלא על ידי הבטחה שהתוכנית שלך תקבל CPU הרבה (הרבה בצורה קיצונית) מכל תוכנית אחרת במחשב, בעזרת Priorities, למשל. עדיין אין הבטחה מוחלטת שתעמוד בכל הזמנים שלך, אבל אם תוודא שבזמן ריצת תוכנית אין יישומים אחרים שרצים בpriority גבוה, רוב הסיכויים שתעמוד בכל הזמנים. אם התוכנה רצה במחשב ייעודי - זה יחסית קל. אם אתה מפיץ את התוכנה למשתמשים ונותן להם להריץ את זה על המחשב שלהם - זה יהיה מאוד מאוד קשה.
 

kniaper

New member
תודה רבה

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

vinney

Well-known member
כן, אפשר בהחלט למדוד

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

kniaper

New member
לא החלטתי על שפה

זו גם המלצה שאני מבקש אני שולט בעיקר ב-VB6 אבל נראה לי לא מתאים אני יכול גם JAVA או C(++) וגם C# ואני לא אתנגד ללמוד גם משהו חדש
 

vinney

Well-known member
אם תזמונים כאלה קריטיים

נראה לי ש++C עדיפה. בJAVA ו#C יש את התוספות שאין לך שליטה עליהן, בדמות הgarbage collection, למשל, שיכולים לעקב אותך ברגעים הכי לא צפויים.
 

kniaper

New member
טוב, אז נניח שאני עושה את זה בC++

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

kniaper

New member
../images/Emo10.gif אבל הצעת לי הכוונה קודם

אני באמת לא יודע מאיפה להתחיל לחפש
 

vinney

Well-known member
אתה כבר עברת את שלב ההכוונה

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

kniaper

New member
תודה על העזרה

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

itaym02

New member
כיוון

בזמנו (6 שנים אחורה) השתמשנו בתוכנות כאלו-אין לי כבר קשרים במעבדות - אתה מוזמןנסות ליצור קשר שם עם הסטודנטים ולחקור אותם. אוני עברית בניין סילברמן קומה 3 אגף3 מעבדה של יערי אאל"ט
 

kniaper

New member
../images/Emo13.gif תודה לעמית לשעבר

במעבדות לפסיכולוגיה קוגניטיבית משתמשים בד"כ בתוכנות ייעודיות לעריכת ניסויים דוגמת e-prime של PST (ויקיפדיה) מכיוון שתוכנות כאלו לא מציגות סרטונים אני נאלץ לכתוב את הקוד לניסוי בעצמי.
 
למעלה