שאלה טכנית ראשונה לפאלם!

udifpalm

New member
שאלה טכנית ראשונה לפאלם!

בתור זה שביקש מאיילת לפתוח את הפורום, מן הראוי שאתחיל לשאול את השאלה הראשונה - בשביל זה הפורום קיים! 1. האם משתנים גלובליים בתוכנת פאלם פשוטה (סגמנט בודד, כתובה ב-C עם CW9) נשמרים בין קריאות שונות של PilocMain? אם כן, האם זה נכון גם לגבי פאלמים עם NVFS? האם זה משנה אם המשתנה הוא גלובלי או סתם סטטי מחוץ לפונקציה (כלומר file scope)? 2. יש לי תוכנה שמשתמשת ב- notifiers ומסיבות של יעילות הגדרתי callback function במקום לקבל event פשוט. כאשר מבצעים הרשמה של ה-notifier יש אפשרות להגדיר פוינטר יחיד (4 בייט) שיצורף לקריאת ה-callback. איך ניתן להשתמש בפוינטר זה? אסביר את שאלתי: האם ניתן לתת סתם מצביע על struct גלובלי כלשהו, כך שאוכל לגשת אליו בפשטות מתוך ה-callback function? או שמא זה חייב להיות מצביע לזכרון שהוקצה במיוחד עם MemHandleNew ולאחר מכן MemHandleLock? או שמא האם ניתן להעביר רק handle ולבצע MemHandleLock רק בתוך ה-callback?
 

TAKEphONE

New member
תשובה

1. לא - הם לא נשמרים. אתה יכול להשתמש ב- FtrGet/Set לשמירת ערכים "גלובליים" 2. הפוינטר צריך להיות מוקצה עם MemHandleNew, לא בטוח לגבי הצורך בנעילה (לדעתי לא צריך לנעול, אבל משיקולי ביצועים - אולי כדאי)
 

udifpalm

New member
מה שניחשתי

1. תודה, זה מה שהבנתי, והפתרון שהצעת הוא גם הפיתרון אותו ניסיתי. 2. כנ"ל - העדפתי להעביר פוינטר ישיר לאחר שעבר נעילה ולא Handle משיקולי ביצועים (למה לבצע נעילה ושחרור בכל קריאה ל-callback)? התוצאה היתה תוכנית של קובץ בודד (600 שורות סה"כ) עם נקודה אחת בה מבוצעת הקצאת זכרון ונעילה, נקודה אחת בה מבוצע שחרור, ואינספור ריסוקים בלתי מוסברים
ביזבזתי על כך כל כך הרבה זמן שהעדפתי לבסוף להעביר את הנתונים שאני צריך ישירות ל-handler ע"י שימוש ב-4 בייט בלבד (של הפוינטר) במקום להעביר פוינטר אמיתי, וכח בעפתי את הקצאות הזכרון ושחרורו. לצערי, 4 בייט לא מספיקים לשימושי (אני רוצה להעביר 8 בייט שכוללים KeyDownEvent מלא + mask לשדה modifiers). כרגע אני בודק רק את שדה ה-KeyDownEvent.chr ולא keyCode שכנראה חיוני בגישה למקשי החומרה במכשירי סוני.
 

TAKEphONE

New member
האם...

האם הכתיבה לפוינטר מתבצעת עם DmWrite ? אם אין ברירה - נסה להשתמש ב-FtrGet / FtrSet... או - לשיפור ביצועים - המשך להשתמש ב-param להעביר את ה-keyDownEvent.chr, בדוק אותו, ורק אם הוא מתאים - קרא את שאר הפרטים ע"י FtrGet
 

udifpalm

New member
מה שעשיתי

אתה יכול לראות את הגרסה המנוונת של התוכנה AltShift באתר mypalm. אני בודק בזמן כניסה לתוכנה ע"י FtrGet אם כבר הקציתי זכרון. אם לא אני מקצה זכרון, נועל אותו,ושומר את הידית+כתובת אחרי נעילה עם שתי קריאות FtrSet שונות. לאחר היציאה אני בודק את דגל ה-enable/disable של התוכנה: אם היא ב-disable אני משחרר את הנעילה, את הזכרון ומוחק את שני ה-Ftr. אם הדגל ב-enable אני רושם את ה-callback ונותן לו את הכתובת האמיתית של הזכרון לאחר נעילה. התוצאה היתה קטסטרופלית - מעבר לכך שהקוד לא פעל, (ה-handler לא קיבל כנראה את הנתונים הנכונים), התוכנה התרסקה תוך הרצה אחת או שתיים שמרתי את הקוד הבעייתי בצד, ואשמח לקבל עליו חוות דעת - כפי שאמרתי מדובר בסה"כ בקובץ בודד בן 600 שורות ברוטו כולל הערות.
 

TAKEphONE

New member
שלח לי...

מלאך... (סתאאם) שלח לי את הקוד, ואשתדל להסתכל עליו כשיהיה לי זמן
 

udifpalm

New member
תודה (ישלח כנראה מחר)

את הקוד הסופי בכל מקרה בכוונתי לשחרר לציבור. (למעט התלות בקובץ include של Piloc שאי אפשר להפיץ, אבל ניתן לקבל חינם באופן אוטומטי בדואר מ-paragon כחלק מה- Piloc API).
 
למעלה