בעייה עם visibility-notify-event

כרמית ש1

New member
בעייה עם visibility-notify-event

שלום,
יש לי אפליקציה שמשתמשת ב visibility-notify-event, שמבצע קריאה לפונקציה.
כאשר האפליקציה הנ"ל רצה בחומרה מתקדמת יותר (ובסביבה עם תוכנות חדישות יותר) אני נתקלת בבעיה, שהקריאה לפונקציה הינה ב loop. כלומר כאשר האפליקציה אמורה להסתיים ולצאת - משום מה הקוד חוזר שוב לפונקציה שנקראת ע"י ה visibility-.notify-event וכך אין יציאה. (מבצע את הפונקציות וחוזר שוב לפונקציה הנ"ל)
בקריאה באינטרנט מצאתי את ההערה הבאה:
GtkWidget::visibility-notify-event has been deprecated since version 3.12 and should not be used in newly-written code.
Modern composited windowing systems with pervasive transparency make it impossible to track the visibility of a window reliably, so this signal can not be guaranteed to provide useful information.
האם זו הסיבה?
אם כן, במה עליי להשתמש במקום?
תודה רבה!!!
 

BravoMan

Active member
שלום כרמית.

מאוד קשה לענות על השאלה שלך כפי שהיא מנוסחת, היות והחסרת המון מידע.
&nbsp
אם אני זוכר נכון מהתכתבותנו הקודמת כאן, יש לך יישום שכתוב בשפת C עם ספריית GTK 2 שרץ על Ubuntu 12.4 על פלטפורמה x86.
&nbsp
היות וכאמור אינך משתמשת כלל ב-GTK 3, והמחשב הוא למעשה עמדה ייעודית כך שכנראה לא משתמש באפקטים גרפיים של שקיפות בשולחן עבודה, רוב הסיכויים שהבעיה שמצאת אינה קשורה.
&nbsp
בלי לראות את הקוד הרלוונטי, קשה מאוד לאבחן בעיה כזו.
האם בדקת שאכן הפונקציה של ה-event היא שנקרת שוב ושוב, או רק הפונקציה השנייה (זו שהפונקציה שמטפלת ב-event קוראת לה)?
&nbsp
האם ייתכן שהפונקציה השנייה נקראת מעוד מקומות, או שהפונקציה לטיפול ב-event מוצמדת לאובייקטים נוספים?
&nbsp
בכל מקרה, כדי לענות על השאלה "במה עלי להשתמש במקום?" צריך להבין מתי את רוצה שהקוד הרלוונטי ירוץ.
למשל, אם את צריכה שקוד מסוים ירוץ כשסוגרים חלון, אז יש לזה event ייעודיים והרבה יותר מתאימים.
בלי להבין מה מטרת הקוד, אי אפשר להמליץ מתי וכיצד להפעיל אותו.
 

כרמית ש1

New member
ועכשיו מפורט יותר...

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

צירפתי קובץ עם הפונקציות שלי בצורה מינימלית ביותר (רק לשם ההבנה של התהליך).
לא יודעת אם זה יעזור להבין. מקווה.
בכל מקרה, אני הייתי מצפה (וכך זה גם עובד בחומרה הישנה) שבסיום פונקציה Main_start_app() האפליקצייה תסתיים, לא? בחומרה החדשה כשאני מריצה בדיבאגר, אני רואה שבכל פעם חוזר ל main_start() מחדש, וככה נמצא בלולאה מתמדת.
לשאלותיך: 1. הפונקציה נקראת רק ממקום אחד. אין קריאות נוספות. 2. זוהי אפליקציה שמקבלת ארגומנט ב main ובהתאם אליו מבצעת דברים. הפונקציה main_start מבצעת איתחולים שונים וקוראת ל main_start_app שזו מבצעת את הפעולה בהתאם לארגומנט שהתקבל ב main. בסיום הפעולה האפליקציה אמורה להסתיים.
המון תודה!!!
 

BravoMan

Active member
קוד קצת תמוהה:

ראשית, בקשה קטנה לעתיד: אם את מפרסמת קוד, תעשי זאת בתוך קובץ txt פשוט, לא docx.
&nbsp
גם משום שהרבה אנשים לא נוהגים לפתוח קבצים כאלה ממקומות לא בטוחים כמו משתמשים אלמוניים בפורום, וגם משום ש-Word משנה דברים בטקסט בלי שאת שמה לב.
למשל, הוא החליט להפוך חלק מאותיות בשמות פונקציות לגדולות, כי הוא חשב שזה תחילת משפט, וזה מקשה על הבנת הקוד, כי לא ברור אם עדיין מתכוונים לפונקציה מקורית של הספרייה שאמורה להיות כולה באותיות קטנות, או לאיזו פונקציית מעטפת שיצרת בקוד ואנחנו פשוט לא רואים.
&nbsp
ספציפית לגבי הקוד:
אם הוא עבד לך קודם, אז רק בפוקס.
האירוע של visibility נקרא תמיד יותר מפעם אחת - גם כשהחלון מופיע, גם כשהוא נעלם, וגם עד כמה שאני מבין כשחלון אחר מכסה אותו. אם לא בודקים מדוע נקראה הפונקציה של ה-event ומבצעים את התוכן שלה כל פעם, וודאי יהיו חזרות.
&nbsp
על פניו, הקוד שלך צריך לרוץ בהיווצרות החלון בלבד.
אם זה המצב, תשקלי להשתמש באחד מהבאים:
map, map-event, show
בזמנו, השתמשתי ב-map-event לאתחול ראשוני של נתוני החלון וזה עבד טוב, אבל אף פעם לא עשיתי תוכנה מוזרה כמו שאת מכינה כאן.
הנה מאמר שמסביר על ה-events השונים שמתאימים לך, מתי הם נקראים ומה ההבדלים:
https://blogs.gnome.org/jnelson/2010/10/13/those-realize-map-widget-signals/
&nbsp
אבל דבר אחד ממש מוזר לי:
אם כל מה שהתוכנה צריכה לעשות זה לעבד את הפרמטרים שהיא קיבלה ב-main (את argv) לבצע פעולה ללא התערבות משתמש ואז להיסגר, למה בכלל ליצור חלון, או להיכנס ל-gtk_main או להשתמש ב-GTK???
&nbsp
אני מבין שהחסרת הרבה דברים מהקוד, אז ייתכן שיש חלקים בלוגיקה שאני מפספס, ואולי הם רלוונטיים ביותר לתשובה, אבל על פניו התוכנה הזאת היא מקרה קלאסי לתוכנה שלא צריכה GUI בכלל. זה כלי "batch" שלא אמור להיות אינטראקטיבי.
&nbsp
אז על פניו, הכלי כתוב עקום.
האם אני מפספס משהו? האם יש מקרים בהם התוכנה לא נסגרת מיד אלא המשתמש אמור לעשות פעולות מסוימות בחלון?
גם אם זה נכון, סדר הקוד לא ממש הגיוני.
&nbsp
על התוכנה לעשות את העיבוד של הפרמטרים לפני שהיא נכנסת ל-gtk_main, ורק אם הממשק באמת נחוץ להקפיץ אותו.
כך היא תוכל להיסגר בצורה מסודרת תמיד.
 

כרמית ש1

New member
לגבי הקוד...

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

תודה רבה!!
 

BravoMan

Active member
שמח שיכולתי לעזור!

לצערי, מצב קוד לגאסי שתיארת יותר מידי נפוץ בתעשייה ויצא גם לי להיתקל במקרים כאלה וכנראה לכל מפתח כמעת, שעובד על משהו רציני יותר מאפליקציה קטנה לאחת הפלטפורמות הניידות.
&nbsp
בהצלחה בהמשך!
 
למעלה