הגדרת תוכנה שתרוץ ברקע כל הזמן
-
טוב, אז הקוד מוכן ועובד.
עכשיו אני רוצה שהוא ירוץ ברקע בלי שיראו אותו, דהיינו שלא יראו את המסך השחור של הקונסול.
כמו כן, אני רוצה שהוא ירוץ תמיד ברקע, וכל פעם שמפעילים את המחשב יעלה מחדש.לגבי הסתרת הקונסול, הבנתי שאני צריך להגדיר במאפיינים במקום "consol application" להגדיר את זה כ - "'windows application".
אולם, השאלה כיצד אני מגדיר את זה כתהליך שרץ כל הזמן ברקע, כיון שעכשיו התכנה רצה, מגדירה טיימר לעוד כמה זמן, ונסגרת.
האם הפתרון הוא windows service כמו שמצאתי כאן?
תודה רבה!פורסם במקור בפורום CODE613 ב22/01/2017 15:04 (+02:00)
-
השיקול אם לבחור בשירות או בתוכנה רגילה הוא לא העובדה שזה רץ ברקע.
לא הבנתי מה הבעיה בתוכנה שרצה ברקע כל הזמן? כמובן יש להוסיף אותה לאתחול. אתה שואל איך עושים זאת? http://stackoverflow.com/a/674654/1271037פורסם במקור בפורום CODE613 ב22/01/2017 17:24 (+02:00)
-
@דוד ל.ט.
השיקול אם לבחור בשירות או בתוכנה רגילה הוא לא העובדה שזה רץ ברקע.
לא הבנתי מה הבעיה בתוכנה שרצה ברקע כל הזמן? כמובן יש להוסיף אותה לאתחול.קודם כל אשמח לדעת מה ההבדלים ביניהם. אבל לעצם הענין אפרט כאן את הצורך המיוחד שלי, ואשמח לשמוע מה אתה ממליץ.
מדובר במחשב של לקוח, שמשתמשים בו עובדים שלו (לא בדיוק.. אבל זה לצורך הענין). הוא רוצה שתרוץ עליו תוכנה שהם לא ידעו על קיומה, כלומר ללא UI וכל דבר דומה שהם יוכלו לסגור אותה, או להתחיל לחשוד מה היא עושה.
כמו כן, התוכנה אמורה לרוץ על המחשב כל הזמן.
בשעות מסוימות העובדים אמורים לעבוד עם הטאבלט ולא עם המחשב, ולכן הם לא אמורים להיות בסביבת המחשב.
הלקוח רוצה לוודא שהם אכן לא נמצאים ליד המחשב, במקום להיות איפה שהם צריכים להיות, ולכן מטרת התוכנה לנטר את החיבור לרשת, ובמידה והיא מזהה חיבור ארוך - ליידע את המעסיק.כמו כן, לא בדיוק הצלחתי לגרום לתוכנה שהיא תעבוד באופן רציף. כיון שאני קורא למתודה (מהשרשור הקודם) שבודקת בהפעלה האם הגיע הזמן להתחיל את הניטור או לא, ולפי זה היא מגדירה את הטיימר ומפעילה את הניטור. וזהו. מיד לאחר מכן נגמרת ריצת התכנית והיא נסגרת, וממילא כשהיא נסגרת גם הטיימר מחוסל (אם אני מבין נכון איך זה עובד..).
העניין הוא שאני צריך שהטיימר ימשיך לחיות כדי להפעיל בשעה הייעודה את מה שצריך לעשות.
אם זו הייתה תוכנית קונסול, הייתי מגדיר:Console.ReadKey() או משהו דומה, שמונע מהתכנית להיסגר. אבל השאלה שלי עכשיו איך אני עושה זאת? חשבתי שאם זה שירות, אז זה לא תהיה בעיה. אבל אני עוד צריך לבדוק זאת.
אשמח לעצות!!
תודה רבה!פורסם במקור בפורום CODE613 ב22/01/2017 19:36 (+02:00)
-
כמו כן, לא בדיוק הצלחתי לגרום לתוכנה שהיא תעבוד באופן רציף. כיון שאני קורא למתודה (מהשרשור הקודם) שבודקת בהפעלה האם הגיע הזמן להתחיל את הניטור או לא, ולפי זה היא מגדירה את הטיימר ומפעילה את הניטור. וזהו. מיד לאחר מכן נגמרת ריצת התכנית והיא נסגרת, וממילא כשהיא נסגרת גם הטיימר מחוסל (אם אני מבין נכון איך זה עובד..).
העניין הוא שאני צריך שהטיימר ימשיך לחיות כדי להפעיל בשעה הייעודה את מה שצריך לעשות.עכשיו חשבתי שאפשר לעשות סתם לולאה טיפשית שלא תגמר לעולם, כדי שהתכנית לא תיסגר, ואז אין צורך בService.
משהו כזה:class Program { static void Main(string[] args) { var scan = new Scanner(new DateTime(2017, 1, 22,9,33,00), new DateTime(2017, 1, 22, 11, 00, 00)); bool play = true; while(play){ int c = 1; c++; } } }
מה אומרים??
פורסם במקור בפורום CODE613 ב22/01/2017 21:55 (+02:00)
-
כדי שהתוכנה לא תפסיק משתמשים בApllication כמו בWinForms וכמו בWPF. (נראה לי שמאחורי הקלעים זה עובד כמו לולאה אלא שזה עם קריאה לפונקציה של Windows נראה לי שממתינה לאירוע קלט כלשהו - והתוכנה "תקועה" עד למענה מהפונקציה הזאת וחוזר חלילה בלולאה).
במילים אחרות תפתח פרוייקט WinForms חדש, תמחק את הForm1 ואז בשגיאות תופנה לMain שם במקום new Form1 תעשה new למחלקה משלך.פורסם במקור בפורום CODE613 ב22/01/2017 23:42 (+02:00)
-
@דוד ל.ט.
במילים אחרות תפתח פרוייקט WinForms חדש, תמחק את הForm1 ואז בשגיאות תופנה לMain שם במקום new Form1 תעשה new למחלקה משלך.
הוא כותב לי את השגיאה הזאת:
Argument 1: cannot convert from 'NetworkScan.Scanner' to 'System.Windows.Forms.Form'
פורסם במקור בפורום CODE613 ב23/01/2017 00:02 (+02:00)
-
סליחה:
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); var myClass = new MyClass(); }
מה שמפריע לי שהתייחסת לבעיה הזאת כבעיה אובייקטיבית כל כך עד שסברת שלכן נועדו סרביסים. באמת! למה שתוכנה ללא תצוגה לא תוכל לעשות מה שתוכנה עם תצוגה עושה בלי בעיות?
סרויסים נועדו לרוץ אחד פר מכונה (ולא פר משתמש), בהרשאות מנהל, ועוד כמה הבדלים. השיקולים בשימוש סרויס בד"כ הם הרשאות.
אין שום בעיה שתשתמש בסרויס אבל הוא טיפה מסובך - מחייב התקנה וכל זה.פורסם במקור בפורום CODE613 ב23/01/2017 21:00 (+02:00)
-
אוי, דוד אתה כנראה מחזיק ממני יותר מדי
אני עדיין בור ועם הארץ, וסה"כ יודע לכתוב קצת קוד..
סה"כ מחיפוש בסטאק וגוגל היה נראה לי שהתשובה היא סרוויס..
אבל אתה צודק, באמת הרבה יותר פשוט לתת תוכנה בלי UI מאשר להתקין סרביס, אבל על הדרך הרווחנו שלמדנו מה זה הסרביס הזה.בכל אופן - תודה עצומה על כל העזרה!!
אברהםפורסם במקור בפורום CODE613 ב23/01/2017 22:14 (+02:00)
-
כתבתי ככה, זה אכן לא זורק שום שגיאה, אבל התכנה מסיימת את פעולתה מיד
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Scanner app = new Scanner(new DateTime(2017, 1, 23, 23, 0, 0), new DateTime(2017, 1, 24, 6, 0, 0)); }
פורסם במקור בפורום CODE613 ב23/01/2017 22:23 (+02:00)
-
אויש אתה צודק, סליחה.
אתה צריך לשים את הApplication.Run הרי זו המתודה ש"תוקעת" את התוכנה עד לסגירתה.
שים את זה שורה אחרי הscaner שלך. ללא פרמטרים. הסיבה שהמלחקה שלך תעבוד אפי' שזה תקוע היא כי זה טיימר וזה על טריד אחר.פורסם במקור בפורום CODE613 ב23/01/2017 23:44 (+02:00)