דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. לולאות for וthread's

לולאות for וthread's

מתוזמן נעוץ נעול הועבר תכנות
18 פוסטים 4 כותבים 442 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY yossiz

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

    import threading
    import serial
    from time import sleep
    from gpiozero import Button
    
    button = Button(27)
    ser = None
    
    def run():
        while ser is None or not button.is_pressed:
            sleep(0.5)
    
        ser.cancel_read()
    
    t = threading.Thread(target=run)
    t.start()
    
    ser = serial.Serial('/dev/ttyUSB0')
    for cc in ser.read():
        a = int(cc)
        print(a)
        aa = aa + a
        print('סכום מצטבר של הערך', aa)
    
    
    מנצפךמ מנותק
    מנצפךמ מנותק
    מנצפך
    כתב ב נערך לאחרונה על ידי
    #8

    הפתרון הנכון הוא להשתמש ב timeOut.
    בדיוק בשביל זה הוא נועד.

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

    תגובה 1 תגובה אחרונה
    2
    • יצירהי מנותק
      יצירהי מנותק
      יצירה
      כתב ב נערך לאחרונה על ידי יצירה
      #9

      @yossiz זה אכן מה שעזר!

      היש סיבה לכך שזה מתאים רק לכפתור פיזי ולא לקריאת פונקציה.
      היינו:

      • עם ספריית pynput יצרתי פונקציה שתשנה ערך של משתנה אם מקש כלשהו נלחץ. [ואז סוגר את הפורט]
      • כיוון שקראתי לפונקציה לפני קריאת הבייטים (שורה 60) הקוד עוצר שם. האם אי אפשר שירוצו "במקביל"? (קראתי על thread, זהו הפיתרון? קראתי גם שהוא לא פיתרון יציב).
      • הקוד: פונקציית מקשים. קריאה לפונקציה. לולאת פור לסריאל.
        עצירת הלולאה אם המשתנה השתנה
        תודה!
      import serial
      
          stc(func = stop_ser)
      
          while True:
              
              for i in ser.read():            
                  sa =int(i)
              
                  saa = saa + sa
                  print (saa')
                  n99 = str(saa)
                  
              if stop_ser != 0:
                  break
                      
      seri()
      print('!!!')
      
      
      yossizY תגובה 1 תגובה אחרונה
      0
      • יצירהי יצירה

        @yossiz זה אכן מה שעזר!

        היש סיבה לכך שזה מתאים רק לכפתור פיזי ולא לקריאת פונקציה.
        היינו:

        • עם ספריית pynput יצרתי פונקציה שתשנה ערך של משתנה אם מקש כלשהו נלחץ. [ואז סוגר את הפורט]
        • כיוון שקראתי לפונקציה לפני קריאת הבייטים (שורה 60) הקוד עוצר שם. האם אי אפשר שירוצו "במקביל"? (קראתי על thread, זהו הפיתרון? קראתי גם שהוא לא פיתרון יציב).
        • הקוד: פונקציית מקשים. קריאה לפונקציה. לולאת פור לסריאל.
          עצירת הלולאה אם המשתנה השתנה
          תודה!
        import serial
        
            stc(func = stop_ser)
        
            while True:
                
                for i in ser.read():            
                    sa =int(i)
                
                    saa = saa + sa
                    print (saa')
                    n99 = str(saa)
                    
                if stop_ser != 0:
                    break
                        
        seri()
        print('!!!')
        
        
        yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי yossiz
        #10

        @יוסף1111 הקוד הזה ממש מאתגר אותי... קשה לי להבין מה קורה שם. האם יש מצב שתוכל לכתוב הקוד הכי קצר שמתמצת את השאלה שלך?

        אגב, כדאי שתתרגל לתת שמות תיאוריים (כלומר שהשם מתאר את הייעוד של המשתנה) למשתנים. (אפילו שם כמו narishkayt 🙂 יותר טוב משם בעל אות אחת, או בעל כמה אותיות בלי משמעות ברורה)

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        יצירהי תגובה 1 תגובה אחרונה
        4
        • yossizY yossiz

          @יוסף1111 הקוד הזה ממש מאתגר אותי... קשה לי להבין מה קורה שם. האם יש מצב שתוכל לכתוב הקוד הכי קצר שמתמצת את השאלה שלך?

          אגב, כדאי שתתרגל לתת שמות תיאוריים (כלומר שהשם מתאר את הייעוד של המשתנה) למשתנים. (אפילו שם כמו narishkayt 🙂 יותר טוב משם בעל אות אחת, או בעל כמה אותיות בלי משמעות ברורה)

          יצירהי מנותק
          יצירהי מנותק
          יצירה
          כתב ב נערך לאחרונה על ידי
          #11

          @yossiz
          תודה רבה על ההכוונה!
          tread פתר למעשה את הבעיה.
          אז נשארה רק השאלה השניה: tread זה דרך בטוחה? יציבה?
          תודה!!

          יצירהי תגובה 1 תגובה אחרונה
          0
          • יצירהי יצירה

            @yossiz
            תודה רבה על ההכוונה!
            tread פתר למעשה את הבעיה.
            אז נשארה רק השאלה השניה: tread זה דרך בטוחה? יציבה?
            תודה!!

            יצירהי מנותק
            יצירהי מנותק
            יצירה
            כתב ב נערך לאחרונה על ידי
            #12

            אני רואה לצערי שthread היא לא דרך מוצלחת כל כך. זה עושה כל כמה פעמים runtime error!. יש דרך אחרת לפקח על 2 דברים "ביחד"?
            אני מסביר: אני צריך מחד לקבל נתונים מיציאת COM ומאידך לעצור את התהליך על ידי הקשה על מקש.
            אי אפשר כמובן להשתמש באינפוט כי כל התהליך יעצור, אלא אני משתמש ב pynput שהיא ספריה להשגיח על מקשי המקלדת.
            וכדי שמאידך הנתונים לא יאבדו בזמן שהמעבד עסוק עם pynput השתמשתי עם thraed. שהוא נכשל כאמור לפעמים.
            תודה!

            מנצפךמ תגובה 1 תגובה אחרונה
            0
            • יצירהי יצירה

              אני רואה לצערי שthread היא לא דרך מוצלחת כל כך. זה עושה כל כמה פעמים runtime error!. יש דרך אחרת לפקח על 2 דברים "ביחד"?
              אני מסביר: אני צריך מחד לקבל נתונים מיציאת COM ומאידך לעצור את התהליך על ידי הקשה על מקש.
              אי אפשר כמובן להשתמש באינפוט כי כל התהליך יעצור, אלא אני משתמש ב pynput שהיא ספריה להשגיח על מקשי המקלדת.
              וכדי שמאידך הנתונים לא יאבדו בזמן שהמעבד עסוק עם pynput השתמשתי עם thraed. שהוא נכשל כאמור לפעמים.
              תודה!

              מנצפךמ מנותק
              מנצפךמ מנותק
              מנצפך
              כתב ב נערך לאחרונה על ידי
              #13

              @יוסף1111 למה לא timeout?
              מה הבעיה שלך איתו?

              יצירהי תגובה 1 תגובה אחרונה
              0
              • מנצפךמ מנצפך

                @יוסף1111 למה לא timeout?
                מה הבעיה שלך איתו?

                יצירהי מנותק
                יצירהי מנותק
                יצירה
                כתב ב נערך לאחרונה על ידי יצירה
                #14

                @מנצפך timeout משמש אותי כדי שהלולאה (for- של הבייטים)
                לא תחכה לנצח לקריאת הנתונים אבל חוץ ממנו אני הרי צריך גם לקרוא לפונקציה שמשגיחה על הקשות המקלדת ולה לא מצאתי timeout- ולכן הייתי חייב להשתמש עם thread

                מנצפךמ תגובה 1 תגובה אחרונה
                0
                • יצירהי יצירה

                  @מנצפך timeout משמש אותי כדי שהלולאה (for- של הבייטים)
                  לא תחכה לנצח לקריאת הנתונים אבל חוץ ממנו אני הרי צריך גם לקרוא לפונקציה שמשגיחה על הקשות המקלדת ולה לא מצאתי timeout- ולכן הייתי חייב להשתמש עם thread

                  מנצפךמ מנותק
                  מנצפךמ מנותק
                  מנצפך
                  כתב ב נערך לאחרונה על ידי
                  #15

                  @יוסף1111 מה הפונקציה שבודקת את הלחיצה?
                  אתה אמור לעבוד ב loop אינסופי, לקרוא מהסריאל, עם timeout, ואז לבדוק את מצב הלחיצה.
                  וחוזר חלילה.
                  במידה ונלחץ, אתה יוצא מה loop בדרך רגילה
                  מה שתעשה זו לולאת while שהתנאי שלה זה שלא נלחץ כפתור.
                  זו הדרך לדעתי שעושים במערכות embedded. אני לא חושב שיש דרך אחרת.

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

                  יצירהי תגובה 1 תגובה אחרונה
                  1
                  • מנצפךמ מנצפך

                    @יוסף1111 מה הפונקציה שבודקת את הלחיצה?
                    אתה אמור לעבוד ב loop אינסופי, לקרוא מהסריאל, עם timeout, ואז לבדוק את מצב הלחיצה.
                    וחוזר חלילה.
                    במידה ונלחץ, אתה יוצא מה loop בדרך רגילה
                    מה שתעשה זו לולאת while שהתנאי שלה זה שלא נלחץ כפתור.
                    זו הדרך לדעתי שעושים במערכות embedded. אני לא חושב שיש דרך אחרת.

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

                    יצירהי מנותק
                    יצירהי מנותק
                    יצירה
                    כתב ב נערך לאחרונה על ידי
                    #16

                    @מנצפך תודה רבה על העזרה!.
                    הפונקציה שבודקת היא של ספריית pynput.והבעיה היא שאני לא מוצא timeout לפונקציה הזו, ולכן ברגע שהיא נקראת היא עוצרת את הכל. ואם אני עושה thraed אני מקבל שגיאה (מידי פעם).

                    מנצפךמ תגובה 1 תגובה אחרונה
                    0
                    • יצירהי יצירה

                      @מנצפך תודה רבה על העזרה!.
                      הפונקציה שבודקת היא של ספריית pynput.והבעיה היא שאני לא מוצא timeout לפונקציה הזו, ולכן ברגע שהיא נקראת היא עוצרת את הכל. ואם אני עושה thraed אני מקבל שגיאה (מידי פעם).

                      מנצפךמ מנותק
                      מנצפךמ מנותק
                      מנצפך
                      כתב ב נערך לאחרונה על ידי
                      #17

                      @יוסף1111
                      לא צריך timeout לפונקציה של הבדיקה של הלחיצה.
                      כי היא בכלל לא ממתינה עד שיש לחיצה.
                      היא מחזירה מיד האם נלחץ או לא.

                      אתה צריך timeout רק בקריאה של הסריאל

                      יצירהי תגובה 1 תגובה אחרונה
                      0
                      • מנצפךמ מנצפך

                        @יוסף1111
                        לא צריך timeout לפונקציה של הבדיקה של הלחיצה.
                        כי היא בכלל לא ממתינה עד שיש לחיצה.
                        היא מחזירה מיד האם נלחץ או לא.

                        אתה צריך timeout רק בקריאה של הסריאל

                        יצירהי מנותק
                        יצירהי מנותק
                        יצירה
                        כתב ב נערך לאחרונה על ידי
                        #18

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

                        תגובה 1 תגובה אחרונה
                        0
                        תגובה
                        • תגובה כנושא
                        התחברו כדי לפרסם תגובה
                        • מהישן לחדש
                        • מהחדש לישן
                        • הכי הרבה הצבעות


                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום