ABA


"2 שאלות על תהליכים processes ב- c#"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15192 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15192
Static
חבר מתאריך 1.7.02
1329 הודעות
   10:54   16.02.09   
אל הפורום  
  2 שאלות על תהליכים processes ב- c#  
 
   אני מריץ את הפרוסס הזה מתוך win form וכאשר הפרוסס רץ כל הפורם משותק עד שהפרוסס מסיים לרוץ, אני מניח שזה בגלל שאני עובד רק עם THREAD אחד
אבל אני לא ממש הצלחתי לפצל את הפרוסס שירוץ בת'רד משלו ולא ישפיע על הפורם.
מישהו יכול להסביר לי איך לעשות את ההפרדה בין הת'רדים או שיש פתרון יותר מוצלח?


ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.FileName = "netsh.exe";
startInfo.Arguments = m_Args
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
output = exeProcess.StandardOutput.ReadLine();
exeProcess.WaitForExit();


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



                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  לגבי השאלה הראשונה Sn00py  16.02.09 11:25 1
     תודה על התשובה.. Static 16.02.09 12:05 2
         אממ akoka 16.02.09 12:24 3
             תודה, אבל לעשות מזעור כמו שהצעת עם הפרוססים אני יודע.. Static 16.02.09 12:39 4
  מצטער על ההקפצה, אבל יש למישהו מושג בקשר לשאלה הראשונה? Static 17.02.09 16:00 5
     ניסית להוריד את ה Sn00py  17.02.09 16:27 6
         ניסיתי את זה עכשיו Static 17.02.09 17:02 7
             אה אוקיי, אז אתה מחכה לתשובה Sn00py  17.02.09 17:51 8
                 תודה, ניסיתי אבל לא הצלחתי להריץ ת'רד Static 19.02.09 09:04 9
                     עשית בלאגן... Sn00py  19.02.09 14:05 10
                         דיי הסתבכתי עם זה Static 19.02.09 14:49 11
                             אתה אומנם צריך להעביר אובייקט אחד Nesher  19.02.09 19:31 12

       
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   11:25   16.02.09   
אל הפורום  
  1. לגבי השאלה הראשונה  
בתגובה להודעה מספר 0
 
   תוריד את המשפט exeProcess.WaitForExit(); וזהו...
אתה מתבלבל בין ת'ראדים לפרוססים... ת'ראדים פועלים בתוך פרוססים, ככה שברגע שיש לך 2 פרוססים יש לך (לפחות) שני תראדים...

לגבי השאלה השניה, לא הבנתי, מה לא בסדר ב CLOSE?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   12:05   16.02.09   
אל הפורום  
  2. תודה על התשובה..  
בתגובה להודעה מספר 1
 
   הורדתי את ה exeProcess.WaitForExit()

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

בקשר לשאלה השנייה, זה סתם איזה קישקוש שמישהו ביקש ממני לעשות לו אז אמרתי שאני אנסה. אם החלון יהיה במצב תקוע כמו not responding במקום לעשות ctrl+alt+del אז אפשר יהיה ללחוץ כפתור ימיני ולבחור kill process""


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka

   12:24   16.02.09   
אל הפורום  
  3. אממ  
בתגובה להודעה מספר 2
 
   אתה יכול למזער את הPROCCESS לאייקון ,ולהוסיף לו CONTEXT MENU משלך,זה אני יודע שאפשרי.

אבל לשנות את הCONTEXT MENU המקורי ,דורש לדעתי נגיעה בAPI של WINDOWS.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   12:39   16.02.09   
אל הפורום  
  4. תודה, אבל לעשות מזעור כמו שהצעת עם הפרוססים אני יודע..  
בתגובה להודעה מספר 3
 
   רציתי באמת לדעת אם מישהו יודע איך אני מתממשק עם ה API של ה WIN
ומוסיף לשם דברים, אם זה אפשרי בכלל...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   16:00   17.02.09   
אל הפורום  
  5. מצטער על ההקפצה, אבל יש למישהו מושג בקשר לשאלה הראשונה?  
בתגובה להודעה מספר 0
 
   המערכת קופאת בזמן שאני מריץ את הפרוסס ורק שהוא מסיים לרוץ אםשר להמשיך לעבוד, אני לא יכול לשים אפילו איזה פרוגרס בר שיראה כאילו המערכת עובדת כי כל החלון תקוע עד שהפעולה מסתיימת...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   16:27   17.02.09   
אל הפורום  
  6. ניסית להוריד את ה  
בתגובה להודעה מספר 5
 
   RedirectStandardOutput?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   17:02   17.02.09   
אל הפורום  
  7. ניסיתי את זה עכשיו  
בתגובה להודעה מספר 6
 
   גם ללא השפעה... חוץ מזה שאני חייב את השורה הזאת בשביל לבדוק מה הפקודה החזירה לי והאם היא עברה בצורה תקינה.


אני אדגים מה התוכנה עושה
היא בעצם מחליפה למחשב את כתובות ה IP, SUBNET,GATEWAY


זהירות, בצעו גיבוי לפני של הגדרות כרטיס הרשת שלכם, כי זה ידרוס אותם.
עם פקודה כזאת:
לכו ל CMD.exe
תריצו את השורה הזאת:
netsh interface ip set address name="Local Area Connection" static 10.1.2.100 255.255.255.0 10.1.2.1 1

וחכו שזה ירשום "Ok." , וזה הזמן שבה המערכת שלי תקועה, עד שמגיע ה OK.
שאותו אני תופס בstandard output ובודק..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   17:51   17.02.09   
אל הפורום  
  8. אה אוקיי, אז אתה מחכה לתשובה  
בתגובה להודעה מספר 7
 
   אז מה שאתה צריך לעשות זה להריץ את הפרוסס השני מת'ראד אחר... ת'ראד שהתפקיד שלו זה לחכות לתשובה
דוגמה:

static void RunProcess()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.FileName = ""; // bla bla...
try
{
using (Process exeProcess = Process.Start(startInfo))
{
Console.WriteLine(exeProcess.StandardOutput.ReadToEnd());
exeProcess.WaitForExit();
}
}
catch { }
}
static void Main(string args)
{

Thread t = new Thread(new ThreadStart(RunProcess));
t.Start();
}

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   09:04   19.02.09   
אל הפורום  
  9. תודה, ניסיתי אבל לא הצלחתי להריץ ת'רד  
בתגובה להודעה מספר 8
 
   בוא ניקח דוגמה מהקד שלי

public void dnsDHCP()
{
waitForm wf = new waitForm();
m_Args = "interface ip set dns \"" + m_Connection + "\" dhcp";
LaunchCommandLineApp(wf, "dhcpDNS");
wf.Dispose();
}


השורה הזאת אמורה לרוץ בת'רד נפרד
LaunchCommandLineApp(wf, "dhcpDNS");

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


static void Main(string args)
{

Thread t = new Thread(new ThreadStart(LaunchCommandLineApp(wf, "dhcpDNS));
t.Start();
}

זה לא עובד, ומקבלים שגיאה שת'רד מחכה למתודה ופה יש פרמטרים אז זה פונקציה והוא לא יכול להריץ את זה...

עצות?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   14:05   19.02.09   
אל הפורום  
  10. עשית בלאגן...  
בתגובה להודעה מספר 9
 
   לא הבנתי כל כך מה עשית פה... אבל יש לך טעויות די חמורות.
הראשונה שבהן - בהנחה שכל השאר תקין, זה ש ThreadStart לא מקבל פרמטרים
בצורה הזו. למען האמת הוא לא מקבל פרמטרים בכלל.

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

בהצלחה

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   14:49   19.02.09   
אל הפורום  
  11. דיי הסתבכתי עם זה  
בתגובה להודעה מספר 10
 
   עברתי על כמה וכמה עמודים ב MSDN, וכל מיני דוגמאות שמצאתי בגוגל..
ולא מצאתי משהו שמתאים למקרה שלי..

אני צריך להעביר 2 פרמטרים לת'רד ובכל הדוגמאות מראים רק איך להעביר אובייקט אחד בודד...

בכל מקרה העלתי לפה את כל הפרויקט ב VS2005
http://rapidshare.com/files/199958117/Network_Config.rar.html


הבעיה שאני מדבר עליה היא בקובץ MainBtnForm.cs
אפשר לעשות שם חיפוש לשורות שקוראות לפונקציה


LaunchCommandLineApp(wf, "dhcpDNS");

אני רוצה שבכל פעם שקוראים לפונקציה LaunchCommandLineApp זה יפתח בת'רד נפרד בשביל שהתוכנית שלי לא תתקע.

מי שמחליט להריץ את התוכנית שידאג לגבות את כתובת ה IP שלו בכרטיס רשת קודם, כי התוכנית תכניס כתובת IP אחרות במקום.

תודה לכולם!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   19:31   19.02.09   
אל הפורום  
  12. אתה אומנם צריך להעביר אובייקט אחד  
בתגובה להודעה מספר 11
 
אבל אף אחד לא אמר שזה חייב להיות אובייקט פשוט
זה יכול להיות אובביקט מורכב שבתוך הפונ' שהת'ראד מפעיל ידע ליצור ממנו מופע מהאובייקט..
מה הכוונה?


private void MyMethod(object parameter)
{
MyObject obj = (MyObject)parameter;
.
.
.
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net