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

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

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

האזנה לערוץ בתוך כמה פונקציות במקביל

מתוזמן נעוץ נעול הועבר תכנות
25 פוסטים 3 כותבים 485 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • י מנותק
    י מנותק
    יוסף בן שמעון
    השיב לnigun ב נערך לאחרונה על ידי
    #21

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

    nigunN תגובה 1 תגובה אחרונה
    0
    • nigunN מנותק
      nigunN מנותק
      nigun
      השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
      #22

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

      
       for {
                           	msg := <-c
                              msgsplit := strings.Split(mesege, ":")
                              if msgsplit[0] == user {
      
                                      filename := msgsplit[1]
                                 
                                      go myAgi.StreamFile(filename, "")
                                    
      
                              }
      
      

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

      מייל: nigun@duck.com

      י תגובה 1 תגובה אחרונה
      0
      • י מנותק
        י מנותק
        יוסף בן שמעון
        השיב לnigun ב נערך לאחרונה על ידי
        #23

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

        package main
        
        import (
        	"fmt"
        	"time"
        )
        
        var usersChannels = make(map[string]chan string)
        
        func main() {
        	go helloUser("A")
        	go helloUser("B")
        	time.Sleep(500)
        	sendDataToUser("A", "Hi")
        	sendDataToUser("B", "By")
        	time.Sleep(500)
        	disconnectUser("A")
        	sendDataToUser("A", "Hi")
        	time.Sleep(5000)
        }
        
        func helloUser(name string) {
        	usersChannels[name] = make(chan string) // כאן אתה מוסיף את הערוץ של המשתמש למפה
        	for {
        		msg, isConnected := <-usersChannels[name] // מאזין למידע מהערוץ
        		if !isConnected { // אם המידע הוא שהערוץ נסגר, זה אומר שהמשתמש התנתק ואפשר לעצור את הפונקציה
        			return
        		}
        		fmt.Println(msg)
        	}
        }
        
        func disconnectUser(name string) { // סוגר את הערוץ כדי לעצור את ההאזנה ומוחק את המשתמש מהמפה
        	close(usersChannels[name])
        	delete(usersChannels, name)
        }
        
        func sendDataToUser(name, data string) {
        	channel, hasUser := usersChannels[name]
        	if hasUser { // כדי למנוע מצב שהמשתמש כבר התנתק והערוץ שלו לא קיים במפה
        		channel <- data
        	}
        }
        
        
        תגובה 1 תגובה אחרונה
        2
        • י מנותק
          י מנותק
          יוסף בן שמעון
          כתב ב נערך לאחרונה על ידי
          #24

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

          package main
          
          import (
          	"fmt"
          	"time"
          )
          
          var usersCallback = make(map[string]func(data string))
          
          func main() {
          	go helloUser("A")
          	go helloUser("B")
          	time.Sleep(500)
          	sendDataToUser("A", "Hi")
          	sendDataToUser("B", "By")
          	time.Sleep(500)
          	disconnectUser("A")
          	sendDataToUser("A", "Hi")
          	time.Sleep(5000)
          }
          
          func helloUser(name string) {
          	usersCallback[name] = func(msg string) {
          		fmt.Println(msg)
          	}
          }
          
          func disconnectUser(name string) {
          	delete(usersCallback, name)
          }
          
          func sendDataToUser(name, data string) {
          	callback, hasUser := usersCallback[name]
          	if hasUser {
          		callback(data)
          	}
          }
          
          
          nigunN תגובה 1 תגובה אחרונה
          1
          • nigunN מנותק
            nigunN מנותק
            nigun
            השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
            #25

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

            מייל: nigun@duck.com

            תגובה 1 תגובה אחרונה
            0

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

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

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