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

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

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

עצירת פעולה שרצה בלולאה בטופס ויז'ואל בייסיק

מתוזמן נעוץ נעול הועבר תכנות
6 פוסטים 4 כותבים 191 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מוטי מןמ מנותק
    מוטי מןמ מנותק
    מוטי מן
    כתב ב נערך לאחרונה על ידי
    #1

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

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

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

    אשמח לעזרה
    מדובר בפרויקט מסוג WindowsFormsApp או שככה לפחות זה השם של תיקיית הפתרון.

    תגובה 1 תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #2

      @מוטי-מן יש את Application.DoEvents שאפשר להוסיף לכל איטרציה של הלולאה

      יותר טוב להריץ את הפונקציה הכבדה על thread נפרד:

      await Task.Run(() => yourFunction());
      

      ע"ע https://grantwinney.com/using-async-await-and-task-to-keep-the-winforms-ui-more-responsive/

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      3
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        כתב ב נערך לאחרונה על ידי dovid
        #3

        הפתרון של WinForms לפי הספר הוא הפקד BackgroundWorker.
        הקוד הראשון בדוגמה שמה ממחיש הכל (התקדמות וביטול ועוד).

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        מוטי מןמ תגובה 1 תגובה אחרונה
        3
        • מוטי מןמ מנותק
          מוטי מןמ מנותק
          מוטי מן
          השיב לdovid ב נערך לאחרונה על ידי מוטי מן
          #4

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

                      Dim selectedFolder As String = ""
                      MsgBox("02")
                      Using dialog As New FolderBrowserDialog()
                          dialog.Description = "בחר את התיקייה"
                          dialog.ShowNewFolderButton = False
          
                          Dim result As DialogResult = dialog.ShowDialog()
                          If result = DialogResult.OK Then
                              selectedFolder = dialog.SelectedPath
                          End If
                      End Using
          
                      MsgBox("03")
          
          

          החלון של 02 קופץ אבל החלון של 03 כבר לא קופץ..

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

          תגובה 1 תגובה אחרונה
          0
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

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

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            3
            • OdedDvirO מנותק
              OdedDvirO מנותק
              OdedDvir
              כתב ב נערך לאחרונה על ידי
              #6

              הסבר:
              הרעיון שהציעו לך להריץ את המשימה על thread נפרד, כך אתה מאפשר לממשק המשתמש להמשיך להגיב בעוד המשימה הכבדה מתבצעת. ממילא, ה-thread שבו אתה מריץ את הקוד הכבד, שונה מה-thread של ממשק המשתמש, ואתה לא יכול לקרוא לממשק המשתמש מתוכו, כגון להציג דיאלוג.

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

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

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

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