ABA


"שאלה ב- VB, מהי הדרך הטובה ביותר ליצור לולאה אינסופית?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10627 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10627
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   19:49   29.03.12   
אל הפורום  
  שאלה ב- VB, מהי הדרך הטובה ביותר ליצור לולאה אינסופית?  
 
   אני רוצה ליצור לולאה שתרוץ ברקע כל הזמן ותבדוק כל מיני דברים.. לולאת DO רגילה ממש תוקעת את התוכנית.. אפשר להשתמש ב DoEvents ואז זה יותר טוב, אבל אני לא בדיוק מבין מה זה עושה, והאם בכל זאת זה יכול להכביד על התוכנית, בהנחה שהלולאה יכולה לרוץ כמה שעות גם... האם יש דרך אחרת, יעילה יותר?

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

השאלה מתייחסת ל VBA, אבל היישום שלה ב VB הוא אותו דבר, ומכיוון שלפי דעתי יש פה יותר חבר'ה שמבינים ב VB, אז אני פונה אליכם..


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אי אפשר לעשות לולאת For Nesher  29.03.12 21:03 1
     For גם תוקעת... MrSus 30.03.12 14:55 3
  תשתמש אבל תבקש מהתהליך ליון קצת אחרת אתה גונב את Webmonster 29.03.12 21:14 2
     מה זאת אומרת? MrSus 30.03.12 14:57 4
  אז אני לא מכיר כל כך VB Sn00py  30.03.12 22:07 5
     מכתב MrSus 30.03.12 22:40 6
         בכל שפה ה sleep יתקע לך את התוכנה Sn00py  31.03.12 01:28 7
             שמע MrSus 31.03.12 02:09 8
                 טוב, מגניב Sn00py  31.03.12 17:08 9
                     אהבתי את הבלוג, נחמדה הקומבינה עם ה fastcall כדי לעשות Net_Boy  01.04.12 20:42 10

       
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   21:03   29.03.12   
אל הפורום  
  1. אי אפשר לעשות לולאת For  
בתגובה להודעה מספר 0
 
וכל פעם שאתה מגיע לערך מסויים לפני הסיום שתאפס את המונה שמריץ אותו?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   14:55   30.03.12   
אל הפורום  
  3. For גם תוקעת...  
בתגובה להודעה מספר 1
 
   התייחסתי רק ל -DO כי זה נראה לי הגיוני יותר ליצור לולאות אינסופיות איתו.. אבל FOR שקול לו מבחינת כמות המשאבים שהוא לוקח..

כמו שציינתי, אני רוצה ליצור משהו שדומה לEvents שמופעלים ברגע שקורה משהו.. הרי גם הם משתמשים בלולאה כלשהי...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Webmonster
חבר מתאריך 21.4.02
2499 הודעות
   21:14   29.03.12   
אל הפורום  
  2. תשתמש אבל תבקש מהתהליך ליון קצת אחרת אתה גונב את  
בתגובה להודעה מספר 0
 
   כל המחשב


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   14:57   30.03.12   
אל הפורום  
  4. מה זאת אומרת?  
בתגובה להודעה מספר 2
 
   אם הבנתי אותך נכון, מה שאתה אומר מצריך התערבות ידנית כל פעם שאני מריץ את התוכנית..? אם כן, אז זה לא פתרון טוב עבורי.. אני לא רוצה שתיהיה התערבות..

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   22:07   30.03.12   
אל הפורום  
  5. אז אני לא מכיר כל כך VB  
בתגובה להודעה מספר 0
 
   אבל זה אותו דבר בכל השפות HIGH LEVEL שאני מכיר.

אתה יכול לעשות לולאה עם Sleepים בסופה ואתה יכול להשתמש ב Eventים.

לשאלתך - איך ה Eventים עובדים: הprocess שלך נכנס לstate של "מחכה". מחכה לEvent שיקרה. הקרנל של וינדואס רושם את ה process שלך כמחכה לאיזשהו תנאי(כלומר, שה event שלך יתממש).

בנוסף, כמה פעמים בשניה נשלח למעבד שלך interrupt של השעון. בזמן הזה הקרנל של Windows (או יותר נכון ה scheduler של וינדואס) מחליט מה הוא רוצה להריץ בtimeslice הבא(כלומר, איזה ת'ראד). בזמן הזה הוא בודק אם יש event שהתממש(נהיה signaled) ואם כן - הוא בודק אם יש מישהו שמחכה לevent הזה ואם כן - מעיר אותו.
בגלל זה Eventים לא לוקחים זמן מעבד, כביכול.

Sleep ממומש אותו דבר - מערכת ההפעלה מכניסה את הת'ראד למצב המתנה, וכל כמה מילישניות בודקת אם אם צריך להעיר אותו.

לסיכום - תשתמש ב eventים. זה יותר טוב מsleepים.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   22:40   30.03.12   
אל הפורום  
  6. מכתב  
בתגובה להודעה מספר 5
 
   קודם כל תודה על ההסבר, למרות שאני עדיין לא בקיא במושגים שהשתמשת בהם, הבנתי פחות או יותר איך זה עובד..

שנית, לצערי אין event מתאים למה שאני רוצה לעשות.. אם היה זה הדבר הראשון שהייתי עושה.
שלישית, ב VBA, לפחות עד כמה שידוע לי, ה SLEEP עובד בצורה זוועתית.. הוא אומנם באמת מחכה את כמות הזמן שהכנסת לו, אבל בזמן הזה כל התוכנה תקועה ואי אפשר לעשות כלום.. הוא מכניס את התוכנה כולה למצב של SLEEP.. יש כל מיני אלטרנטיבות כמו להשתמש ב SLEEP של ה windows scripting host.. אבל באמת שאני לא יודע כמה זה שונה מלהריץ לולאת DO שתמשתמש ב doevents כי תאכלס זה עושה תעבודה, לא תוקע, ולא מפריע לעבודה כלל.. העניין שאני לא יודע באמת איך זה עובד, כך שאני פוחד להשתמש בזה באופן קבוע.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   01:28   31.03.12   
אל הפורום  
  7. בכל שפה ה sleep יתקע לך את התוכנה  
בתגובה להודעה מספר 6
 
   אם אתה מריץ את ה sleep באותו ת'ראד של ה-GUI.

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

בקיצור - מה אתה מנסה לעשות?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MrSus
חבר מתאריך 8.5.09
1801 הודעות
   02:09   31.03.12   
אל הפורום  
  8. שמע  
בתגובה להודעה מספר 7
 
   הידע לי מועט בנושאים האלה..

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

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

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

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

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

אני מדבר כמובן על מאקרו בוורד, ולא תוכנית צד ג' או משהו כזה.. כך שכל הקוד נכתב ב VBA.
יישמתי כבר חלק בשימוש ב DO עם DOEVENTS כמו שאמרתי.. אבל אני מפחד שאני עושה את זה בצורה לא נכונה..

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   17:08   31.03.12   
אל הפורום  
  9. טוב, מגניב  
בתגובה להודעה מספר 8
 
   נשמע שלהשתמש ב DOEVENTS זה הדבר הנכון(ואם מטריד אותך שאתה לא מבין מה זה עושה פשוט תקרא מה זה עושה ב MSDN)

אגב, לגבי ה document_change וכו' - גם אם ה EVENTים האלה לא קיימים אתה יכול להתממשק עם OLE לוורד. אבל זה באמת קצת יותר מסובך.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:42   01.04.12   
אל הפורום  
  10. אהבתי את הבלוג, נחמדה הקומבינה עם ה fastcall כדי לעשות  
בתגובה להודעה מספר 9
 
   hook ל thiscall.
תמשיכו לעדכן אותו


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net