
this.GetHashCode() בקונסטרקטור ובמתודת send, כדי לזהות מאיזה אובייקט מגיעה כל הודעה. כך רואים בזמן ריצה שנוצרו שני אובייקטים.הטקסט המלא של הדקות הראשונות בהרצאה «הדגמה של Singleton - חלק 9» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בשיעור של היום אנחנו רוצים לראות מה קורה כאשר שני Threadים מנסים במקביל לגשת לאובייקט שהוא סינגלטון ואם זו הפעם הראשונה שהם מנסים לגשת אליו אז הם עלולים לנסות ליצור אותו בו זמנית.
ואנחנו נרצה להתייחס לקוד של היצירה, לליבה של היצירה של הסינגלטון ולראות מה קורה שם כאשר שני סרדים מפעילים אותו במקביל. אנחנו נראה איזה תקלות נוצרות ומה התיקון לתקלות.
עכשיו, מה שאנחנו נעשה, אנחנו נבנה פרויקט חדש. בפרויקט הזה אנחנו נבנה סרד אחד שידמה את האודיו רקורדר, סרד שני שידמה את הוידאו רקורדר, ואנחנו נבנה אובייקט אחד או קלאס אחד שהוא יהיה סינגלטון שידמה את ה-Communication Component.
אז סרד אחד עבור המיקרופון, סרד שני עבור הוידאו וקלאס סינגלטון של הקומיוניקיישן. שני הסרדים, האודיו והוידאו, ינסו בו זמנית לפנות אל ה-Communication Component ולהגיד לו send.
אז הם ינסו ליצור אותו ולהגיד לו send בו זמנית, אבל הקטע הקריטי הוא שהם ינסו ליצור אותו בו זמנית. ואז ננתח את התוצאה, נראה איזה בעיות יש ומה הפתרון.
אז בואו נפתח את הוויז'ואל סטודיו ניו פרוג'קט ווינדוס קונסול וזה יהיה סינגל טון סרדס סינגל טון בלי E סרדס אנטר יופי.
אז במיין שלנו אנחנו הולכים ליצור שני סרדים אז בואו נגדיר סרד סרד אלט שיפט F10 אנטר סרד זה יהיה האודיו סרד. שווה New Audio Thread, עכשיו ה-thread יש לו ארבעה אוברלורדים לקונסטרקטור, אנחנו רוצים את מספר שתיים, אנחנו רוצים להעביר לו Thread Start, מה זה ה-Thread Start הזה?
אז הוא אומר פה למטה ש-Thread Start זה דליגט, זה פוינטר לפונקציה, אם אני אעשה F12, אני אלך ל-thread ואני אעשה קונטרול F, Thread Start, הנה, הנה Thread Start, אז Thread Start F12, ככה נראה ה-Thread Start, זאת אומרת, זה פונקציה שמחזירה ווייד ולא מקבלת שום דבר.
אוקיי, בואו נסגור את זה, קונטרול F4. אז אנחנו נרצה להגדיר פונקציה פה מעל, סטטיק, ווייד, וזה יהיה האודיו רוק, שהיא לא מקבלת שום דבר ולא מחזירה שום דבר.
עכשיו, כל מה שהיא תעשה, היא תנסה ליצור, או היא תנסה להגיד לרכיב הקומוניקיישן שלנו, שתכף ניצור אותו, תרצה להגיד לו singleton.communication.instance.send ולשלוח איזשהו משהו.
טוב, תכף נכתוב את זה. רק דבר ראשון, בואו ניפטר מהתקלה כביכול, אז הוא רוצה פה את השם של הפונקציה, אז נגיד לו audio.proc.f6.build succeeded מצוין. אוקיי, אז אנחנו מייצרים את הסרד וכבר ניתן לסרד שלנו שם כדי שאפשר יהיה לדבג יותר בקלות בדיבאגר השם מופיע וזה מאוד נוח אחרת נורא קשה לדבג אודיו ואודיו סרד נקודה סטארט תתחיל לרוץ
מצוין כשהסרד כן אנחנו רוצים את זה ואנחנו רוצים סרד אחר שני שהוא יהיה וידאו סרד אז קונטרול h את המילה אודיו נחליף עם המילה וידאו וריפלייס ריפלייס זה צריך להיות עם v גדולה ריפלייס ריפלייס וריפלייס רק זה צריך להיות עם v גדולה שיפט v וצריך פונקציה חדשה למרות שהפונקציות זהות אבל אני רוצה פונקציות נפרדות גם גם במציאות שאני בונה מערכת וידאו קונפרנס,
הקוד של האודיו פרוסס ושל הוידאו פרוסס שונים בתכלית. אוקיי, אז זה יהיה הוידאו פרוק. בוא נעשה F6, עבר בשלום, מצוין.
אז עכשיו, מה עושים שני ה-threadים? אז כל אחד מהם יגיד Communication. אוקיי, אז בואו ניצור את ה-Class. זה יהיה סינגלטון Communication. בוא נקרא לו, אולי נקרא לו סינגלטון Communication, סינגלטון קומיוניקיישן שיהיה יותר ברור שזה הסינגלטון אובייקט שלנו אוקיי אז מה שאנחנו רוצים להגיד לו רוצים להגיד לאינסטנס שלו סינגלטון
קומיוניקיישן נקודה אין לו אינסטנס תכף ניצור אינסטנס אני כותב את זה כפונקציה על שיפט f10 enter רק כדי שהוא ייצור לי את זה ואז אני מסיר את זה ואני אגיד לו נקודה send send ופה אנחנו נעביר לו זה אודיו זה מה שאנחנו עושים עכשיו זה הפרופרטי אינסטנס שלנו אז זה יהיה get זה נוציא ובסופו של דבר
אנחנו מחזירים אינסטנס קטן נחזיר אינסטנס גדול נמיר אותו לקטן וזו התכונה אנחנו צריכים גם שדה שהוא יהיה private static void אינסטנס וזה השדה ואנחנו לא מחזירים אינסטנס לא מחזירה ווייד אינסטנס מחזירה סינגלטון קומיוניקיישן F6 יש בעיה F8 כי זה לא ווייד יפה אז זה סינגלטון קומיוניקיישן F6 F8 יפה אין לנו פונקציה
send אלט שיפט F10 אנטר וזו הפונקציה send, הפי, פי זה טוב, אבל זה, נגדיר את זה בתור המילה פאקט, ומה שאנחנו עושים, cw-tab-tab, console.writeland, אנחנו פשוט מדפיסים שהפאקט שהגיע, send נשלחה, ונמחק את החריגה.
F6, מצוין, הכל עובר בשלום. אותו דבר אנחנו רוצים מהקונטרול C, קונטרול V, קונטרול X, אנחנו רוצים כאן לכתוב וידאו יפה מאוד אוקיי הדבר האחרון שנותר זה רגע מה הוא רוצה מהאינסטאנס is never assigned to will always have כן לא בדקנו טוב מאוד שהוא מזהיר אותנו אנחנו רוצים בתכונה אם אינסטאנס שווה לנעל אז אינסטאנס
שווה לניו סינגלטון ואנחנו רוצים F12, קונסטרקטור, אין לנו קונסטרקטור, אז נכתוב פה ctor tab tab, נשנה אותו ל-private, ונדפיס cw tab tab, שניקח את זה ונדביק את השם של המחלקה, ctor invoked f6, בילד סקסידד, יפה.
זהו, נורא פשוט, הכל מול העיניים, קונטרול שיפט אנטר מעביר אותי למסך מלא כדי שנוכל לראות הכל אפשר גם את זה לנקות אורגניז יוזינג רימוב אנד סורט רואים כמעט הכל לא כמעט הכל אבל בסדר אפשר אולי בוא נעשה קונטרול שיפט אס אני שוקל להפריד את זה בוא נעשה קונטרול אלט אל בוא נפריד את זה
לקובץ נפרד את ההגדרה של הקלאס אז ניקח את זה, נעשה לו cut, נגדיר פה עכבר ימני, אפשר אפילו ctrl z, פשוט את פרוגרם לשכפל, ctrl cv, ולזו לקרוא, פשוט את זה אני לוקח, עושה לזה קופי, ctrl alt l, f2, ctrl v, אוריד את הרווח, enter.
אז המחלקה לא תכיל את מחלקת פרוגרם, קונטרול איקס ופרוגרם לא תכיל את המחלקה של הסינגלטון. בילד, בואו נצא עם מסך מלא ו-F6 עובר בשלום. בואו ננסה לשים אותם צד לצד ואת זה אפשר להזיז ככה.
ועכשיו רואים את הכל, יפה מאוד. אוקיי, אז בואו נעבור על מה שאנחנו בעצם עושים. אז הפרוגרם מתחיל במיין. אז במיין אנחנו מייצרים סרד ראשון, ונותנים לו שם, אודיו סרד, ואומרים לו סטארט, אז הוא מתחיל לרוץ.
הוא מתחיל לרוץ, אז הפונקציה הזו מתחילה, ומיד מסתיימת ומתה. ונגמר, והסרד מת.
יוצאים מהפונקציה והסרד מת. ובמקביל, מיין ממשיכה, מייצרת סרד שני, הוידאו סרד, נותנת לו שם, ואומרת לו גם סטארט, והוא גם מתחיל לרוץ, מהוידאו פרוק, מבצע את השורה הזו ומסתיימת הפונקציה וה-thread של הוידאו מת, ובמקביל גם מיין מסתיימת וה-thread של מיין מת.
אז ככה שלושת ה-threadים מתו וכל הקוד התבצע. עכשיו, כאשר אנחנו מבצעים את אודיו פרוק ווידאו פרוק, למעשה הם מתבצעים במקביל, כי אנחנו לא יודעים, כששני threadים רצים במערכת, הם רצים בעצם, הם עלולים לרוץ במקביל, אם יש לנו שני מעבדים או שהם עלולים לרוץ
במקביל, אם יש לנו שתי ליבות או אפילו אם יש לנו רק מעבד אחד וליבה אחת, הם רצים במקביל בזה שהמערכת ההפעלה מחליפה ונותנת קצת זמן לפרד אחד לרוץ וקצת זמן לפרד שני לרוץ.
יוצא שבעצם קצת קוד פה מתבצע ואז קצת קוד פה וקצת קוד פה וקצת קוד פה ואנחנו לא יודעים איך המערכת תחלק בעצם את הקוד, כמה קוד של זה התבצע, מכות של זה אז בעצם מבחינתנו זה עלול להיות במקביל.
זאת אומרת אנחנו לא יודעים מה יקרה לפני מה אז צריך לקחת הכל בחשבון אבל בטח אם יש לנו שתי ליבות ושני מעבדים ו/או שני מעבדים זה בטח ה-threadים יכולים ממש לרוץ במקביל.
אוקיי זה מה שקורה במיין עכשיו ברגע שה-thread פונה לאינסטנס לשדה אינסטנס אז אנחנו מפעילים את אז מופעלת גט גט בודקת אם אינסטנס קטן הוקצה אם לא או, אז היא מייצרת סינגרטון חדש, כן, ניו מקצה סינגרטון חדש, הקונסטרקטור מאתחל את האובייקט שזה עתה הוקצה,
ו... סליחה, שמה, שמה את המקום בזיכרון שניו הקצתה אל תוך אינסטאנס, כך שאינסטאנס מצביע על הקצאת הזיכרון החדשה של ניו, ואז ריטרן מחזירה את הקצאת הזה, את המיקום הזה בזיכרון.
אבל תוך כדי, גם הפרד השני,