תוספים/הרחבות וmultithreadים c# - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תוספים/הרחבות וmultithreadים c#


eido300

Recommended Posts

1. איך אפשר להוסיף לתוכנה את האפשרות של הוספת תוספים, כמו לדוגמא בדפדפנים למיניהם וכו', ואולי אני טועה, אבל יש תוכנות כמו גימפ שבהם הוספת התוספים (הסקריפט-פו) היא שונה מהצורה שבה מוסיפים לדפדפנים, אבל שוב יכול להיות שאני טועה.

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

קישור לתוכן
שתף באתרים אחרים

בבקשה אל תקפיץ לפני שעברו 24 שעות מההודעה האחרונה בדיון.

פלטפורמות מסויימות מאפשרות לטעון קוד באופן דינמי ולהריץ אותו. הנה דוגמה איך לעשות את זה בג'אווה.

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

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

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

קישור לתוכן
שתף באתרים אחרים

א. מתנצל.

ב. אז אני מבין שאופציה א' לא רלוונטית בc#, בג'אווה זה חלק מובנה בשפה, בc# לא ראיתי משהו כזה.

איך אני יכול ליצור אינטרקציה בין שתי התוכנות?

קישור לתוכן
שתף באתרים אחרים

ודאי שזה אפשרי גם ב-#C, סתם נתתי דוגמאות מג'אווה.

הנה דוגמא מ-#C.

אם האובייקט שאתה יוצר באמצעות CreateInstance מממש interface שקיים בפרוייקט שלך, אז אתה יכול אפילו לעשות casting ל-interface הזה ולהשתמש בפונקציות שלו ישירות, בלי הצורך ב-method.Invoke.

קישור לתוכן
שתף באתרים אחרים

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

בפועל אני מקבל את השגיאה הבאה:

לא היתה אפשרות לטעון קובץ או הרכבה 'D:\\plugin\\ClassLibrary.dll' או אחת מהתלויות שלו. שם ההרכבה או ה- codebase שצוין אינו חוקי. (חריג מ- HRESULT: 0x80131047)

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

ואשמח אם תוכל להסביר את השורה הבאה:

object obj = Activator.CreateInstance(myType);

השאר די מובן.

לגבי הmultithread, אני מבין שזה לא משהו שאני אמור ללמוד כחלק מ#c אלא כחלק מהבנת המערכת הפעלה, אם זה נכון, בספר modern Operating Systems 3e Andrew S. Tanenbaum יש פרק על: יצירת תהליכים ותהליכונים ותזמונם, קטעים קריטיים ובעיות של תיאום ותקשורת בין תהליכים, ופרק על בעיית הקיפאון (‏Deadlock‎)‏ והדרכים להתמודד עמה, זה בעצם מה שאני אמור ללמוד? או שיש משהו אחר/עוד משהו?

תודה.

קישור לתוכן
שתף באתרים אחרים

תשתמש בפונקציה Assembly.LoadFrom במקום Assembly.Load. הפונקציה שהשתמשת בה לא מקבלת שם קובץ, אלא רק שם של אסמבלי, ואז היא מחפשת אותו בכל מיני מקומות דיפולטיים.

CreateInstance זה מה שיוצר לך מופע של האובייקט מטיפוס myType. דהיינו זה "שקול" לפעולה ()new Class1.

קישור לתוכן
שתף באתרים אחרים

מצטער על החפירה, אבל נתקלתי בעוד בעיה...

עשיתי בדיוק כמו שכתוב בדף ששלחת אותי אליו, אבל הקומפלייר זורק חריג : ההפניה לאובייקט לא הוגדרה למופע של אובייקט.

הרצתי את הדיבאגר ומתברר שהוא לא מעדכן את המשתנה myType, הוא נשאר null ואז כשמעבירים אותו לmyMethod הוא זורק חריג.

ניסיתי להשתמש בפונקציה

GetTypes();

במקום ב

GetType("Class1");

והוא באמת עידכן את myType לclass1, אבל כשהוא הגיע ל

GetMethod("writeText"):

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

GetMethods();

, פה זה כבר לא עזר... הוא אכן העביר כמה פונקציות אבל את הפונקציות הלא נכונות (ToString וכאלה)

כמובן זה הקוד המלא (גם של הקובץ dll), למקרה שהבעיה בקוד.

קישור לתוכן
שתף באתרים אחרים

יש אפשרות להעביר פרמטרים בתור ref לפונקציה המיובאת? לא הצלחתי למצוא מקום שאפשר לכתוב בו את הref.

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

קישור לתוכן
שתף באתרים אחרים

זה אפשרי, אבל מסורבל ולא מומלץ.

באופן כללי, עדיף להימנע כמה שיותר מ-reflection, ולהשתמש בו אך ורק כדי ליצור את האובייקט. במקום השימוש ב-GetMethod ו-Invoke, עדיף להשתמש בממשקים.

הרעיון הוא כזה:

יש לך שלושה פרוייקטים. נקרא להם A,B,C.

ב-A אתה מגדיר בו ממשק, נקרא לו IPlugin, עם כל הפונקציות שאתה רוצה שהפלאגינים יחשפו, לדוגמה WriteText.

ב-B אתה מגדיר את המחלקה Class1. אתה שם ב-B רפרנס לפרוייקט A, ודואג ש-Class1 תממש את הממשק IPlugin.

ב-C אתה שם את הקוד טוען את הפלאגין. אתה שם ב-C גם כן רפרנס ל-A, כדי שיכיר את IPlugin.

עכשיו, כשאתה יוצר מופע של המחלקה Class1 באמצעות Activator.CreateInstance, האובייקט שיש לך ביד מממש את הממשק IPlugin. לכן אתה יכול להמיר אותו מ-object ל-IPlugin, ואז אתה יכול להשתמש בפונקציות שלו כאוות נפשך, בלי צורך ב-reflection כלל.

אגב, A ו-C יכולים להיות אותו פרוייקט (דהיינו להגדיר את IPlugin בפרוייקט הראשי שלך, וב-B לשים רפרנס אליו).

יש מבין?

לשאלתך השנייה: כן, נראה שפרק 2 ופרק 6 הם רלוונטיים לנושא. בכל מקרה עדיף נסיון קונקרטי, לא רק קורס תיאורטי.

קישור לתוכן
שתף באתרים אחרים

ככה? אם כן, יש מבין. ;-)

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

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

void writeText(ref string a, string b)
{
a = b;
}

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

 writeText(ref textBox1.Text, textBox2.Text);

ולא הצלחתי לעשות את זה בinvoke

קישור לתוכן
שתף באתרים אחרים

כאמור, אפשר אבל זה מסורבל. חפש בגוגל c# reflection ref ותמצא דוגמאות.

הרי בכל מקרה אתה צריך "לתכנן מראש". כשאתה כותב את Form1 אתה צריך לדעת של-Class1 יש פונקציה בשם writeText שמקבלת שני פרמטרים מטיפוס string שהראשון הוא ref. הדרך הכי טובה לדעת את זה היא ע"י ממשק.

באופן כללי, כשכותבים תשתית פלאגינים, אתה צריך לספק מה שנקרא "hook" - נקודה שבה הפלאגין מתממשק עם הקוד של התוכנה שלך. ה-hookים האלה מוגדרים ע"י הממשק IPlugin. אחרת, איך מי שכותב את הפלאגין ידע איזה קוד הוא צריך לכתוב בכלל?

עריכה: הממ, מסתבר שזה לא מסורבל כמו שחשבתי, זה אמור לעבוד כמו שמעבירים פרמטרים רגילים ל-invoke. איך ניסית לעשות את ה-invoke?

קישור לתוכן
שתף באתרים אחרים

הרי בכל מקרה אתה צריך "לתכנן מראש". כשאתה כותב את Form1 אתה צריך לדעת של-Class1 יש פונקציה בשם writeText שמקבלת שני פרמטרים מטיפוס string שהראשון הוא ref. הדרך הכי טובה לדעת את זה היא ע"י ממשק.

נכון לא חשבתי על זה...

באופן כללי, כשכותבים תשתית פלאגינים, אתה צריך לספק מה שנקרא "hook" - נקודה שבה הפלאגין מתממשק עם הקוד של התוכנה שלך. ה-hookים האלה מוגדרים ע"י הממשק IPlugin. אחרת, איך מי שכותב את הפלאגין ידע איזה קוד הוא צריך לכתוב בכלל?

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

עריכה: הממ, מסתבר שזה לא מסורבל כמו שחשבתי, זה אמור לעבוד כמו שמעבירים פרמטרים רגילים ל-invoke. איך ניסית לעשות את ה-invoke?

זה מה שעשיתי:

זו הפונקציה:

public void writeText(ref string a, ref string b)
{
a = b;
b = "";
}

זה הקריאה לפונקציה (הinvoke):

myMethod.Invoke(obj, new object[] { textBox1.Text, textBox2.Text });

לא הצלחתי למקם את הref, כל מקום שכתבתי אותו קיבלתי שגיאה.

קישור לתוכן
שתף באתרים אחרים

מה זאת אומרת "סתם ליצור ממשקים"? צריך לעשות בדיוק את מה שעשית עם ה-IPlugin. אם אתה רוצה שבפלאגין שלך יהיו כמה מחלקות, אז כן, לכל אחת מהן צריך ליצור ממשק.

לא צריך לדחוף את ה-ref לשום מקום. פשוט צריך לדאוג לשמור את המערך במשתנה לפני שאתה מעביר אותו לפונקציה. המערך יתעדכן עם הערכים החדשים.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...