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

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

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

ProgressBar בWPF תוך כדי פעולת thread

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 4 כותבים 330 צפיות 4 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • pcinfogmachP pcinfogmach

    יש לי קוד בc# שקורא כמות של קבצים בבת אחת (בעצם תוכנת חיפוש פשוטה שאמורה לשמש את מי שאין לו מקום במחשב בשביל אינדקס) וכדי למהר את הפעולה אני משמתמש בThreading

    נתקלתי בבעיה שאני לא מצליח לעדכן את הprogressbar תוך כדי פעולת הthreading כדי להראות התקדמות. (בwinforms הצלחתי על ידי invoke).

    ניסיתי על ידי Dipatcher ללא הועיל.
    ניסיתי על ידי Binding ללא הועיל.

    בעצם מה שקורה שאם אני עושה פעולת דמע

     Thread.Sleep(100); // Simulating some work being done
    

    אז הכל טוב
    אבל ברגע שאני מתחיל לקרוא קבצים שום כלום.
    מצו"ב הקוד שלי של הbinding אשמח לקבל עזרה

    <Window x:Class="WPF_BInding.ProgressBarBinding"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WPF_BInding"
            mc:Ignorable="d"
            Title="ProgressBarBinding" Height="450" Width="800">
        <Grid>
            <StackPanel>
            <ProgressBar Height="25" Name="progressBar" Minimum="0" Maximum="100" Value="{Binding PercentDone}" />
            <Button Content="Start Task" HorizontalAlignment="Center" VerticalAlignment="Bottom" Click="StartTask_Click" />
            </StackPanel>
        </Grid>
    </Window>
    
    
     public partial class ProgressBarBinding : Window, INotifyPropertyChanged
     {
         private int _percentDone;
         private int _progressBarMaximum = 100;
    
         public int PercentDone
         {
             get { return _percentDone; }
             set
             {
                 if (_percentDone != value)
                 {
                     _percentDone = value;
                     OnPropertyChanged(nameof(PercentDone));
                 }
             }
         }
    
         public int ProgressBarMaximum
         {
             get { return _progressBarMaximum; }
             set
             {
                 if (_progressBarMaximum != value)
                 {
                     _progressBarMaximum = value;
                     OnPropertyChanged(nameof(ProgressBarMaximum));
                 }
             }
         }
    
         public event PropertyChangedEventHandler PropertyChanged;
    
         protected virtual void OnPropertyChanged(string propertyName)
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
    
         public ProgressBarBinding()
         {
             InitializeComponent();
             DataContext = this; // Set the data context to the MainWindow itself
             progressBar.Maximum = ProgressBarMaximum; // Set the initial Maximum value
         }
    
    dovidD מנותק
    dovidD מנותק
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי
    #2

    @pcinfogmach כתב בProgressBar בWPF תוך כדי פעולת thread:

    ניסיתי על ידי Dipatcher ללא הועיל.
    ניסיתי על ידי Binding ללא הועיל.

    Binding לא משנה פה, Dispacher עשוי בשביל זה אבל על האופן הזה לא הבאת קוד שנבין למה לך זה לא עובד.

    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    pcinfogmachP תגובה 1 תגובה אחרונה
    0
    • dovidD dovid

      @pcinfogmach כתב בProgressBar בWPF תוך כדי פעולת thread:

      ניסיתי על ידי Dipatcher ללא הועיל.
      ניסיתי על ידי Binding ללא הועיל.

      Binding לא משנה פה, Dispacher עשוי בשביל זה אבל על האופן הזה לא הבאת קוד שנבין למה לך זה לא עובד.

      pcinfogmachP מנותק
      pcinfogmachP מנותק
      pcinfogmach
      כתב ב נערך לאחרונה על ידי
      #3

      @dovid

      private async void search(string[] files)
      {
          progressBar.Maximum = files.Length;
          List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>();
          foreach (string file in files)
          {
              searchTasks.Add(Task.Run(() =>
              {
                  this.Dispatcher.Invoke(() =>
                  {
                      progressBar.Value = progressBar.Value + 1;
                      File.ReadAllLines(file);
                  });
              }));
          }
          await System.Threading.Tasks.Task.WhenAll(searchTasks);
          progressBar.Value = 0;
      }
      

      גמ"ח מידע מחשבים ואופיס

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

        הסיבה שלא קורה כלום זה כי עשית progressBar.Value = 0 בסוף.
        זה קורה רק אחרי שהכל כבר נגמר שהרי שורה לפני כן (בשורה 16) המתנת לסיומם.
        קשה לי מאוד לראות את השאלות שלך ככה. זה תענוג לעזור למישהו להתקדם, אבל זה עינוי לראות אותו מתבוסס בניסוי וטעיה.

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        pcinfogmachP תגובה 1 תגובה אחרונה
        0
        • dovidD dovid

          הסיבה שלא קורה כלום זה כי עשית progressBar.Value = 0 בסוף.
          זה קורה רק אחרי שהכל כבר נגמר שהרי שורה לפני כן (בשורה 16) המתנת לסיומם.
          קשה לי מאוד לראות את השאלות שלך ככה. זה תענוג לעזור למישהו להתקדם, אבל זה עינוי לראות אותו מתבוסס בניסוי וטעיה.

          pcinfogmachP מנותק
          pcinfogmachP מנותק
          pcinfogmach
          כתב ב נערך לאחרונה על ידי pcinfogmach
          #5

          @dovid
          לא הבנתי כלום. אני מודה באשמה הניסיון שלי בbinding היה ניסוי וטעיה (אני עוד לא מבין את המושג מספיק). אבל הקוד של ה-Invoke לא נתפס אצלי כניסוי וטעיה - אולי הוא טעות אבל לא ניסוי וטעיה.

          הנה איך שאני מבין את הקוד - תסביר לי היכן אני טועה או פשוט לא מבין כלום:

          1. הקוד יוצר רשימה של משימות
          2. הוא מבצע אותם בצורה של threading
          3. כל משימה מכילה בתוכ פקודה של עדכון ה-progressbar (שזה לא קורה!)
          4. לאחר סיום כל המשימות ה-progressbar מאופס כדי שיהי מוכן לחיפוש הבא.

          נ.ב. גם אשמח אם תסביר לי למה בwinforms בדיוק אותו הדבר עובד מצויין. (רק ששם אני יכול להשתמש עם invoke בלי dispatcher).

          גמ"ח מידע מחשבים ואופיס

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

            אתה צודק, הבעיה לא קשורה למה שכתבתי, הProgressBar לא מתעדכן בעת ריצת הTask .
            הטענה שלי היא לא שאתה לא עושה את המיטב, אלא שאתה בלי ספר/מדריך/מורה דרך נורמליים. גם אם הקוד שלך היה עובד הוא גרוע מאוד, ולכן זה מציק לי.

            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
            pcinfogmachP תגובה 1 תגובה אחרונה
            1
            • dovidD dovid

              אתה צודק, הבעיה לא קשורה למה שכתבתי, הProgressBar לא מתעדכן בעת ריצת הTask .
              הטענה שלי היא לא שאתה לא עושה את המיטב, אלא שאתה בלי ספר/מדריך/מורה דרך נורמליים. גם אם הקוד שלך היה עובד הוא גרוע מאוד, ולכן זה מציק לי.

              pcinfogmachP מנותק
              pcinfogmachP מנותק
              pcinfogmach
              כתב ב נערך לאחרונה על ידי
              #7

              @dovid
              אשמח אם תסביר לי למה הקוד גרוע מאוד.
              תכל'ס יש פיתרון לבעיה? איך להציג התקדמות בפעולה שכזו?

              גמ"ח מידע מחשבים ואופיס

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

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

                • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                pcinfogmachP תגובה 1 תגובה אחרונה
                0
                • dovidD dovid

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

                  pcinfogmachP מנותק
                  pcinfogmachP מנותק
                  pcinfogmach
                  כתב ב נערך לאחרונה על ידי pcinfogmach
                  #9

                  @dovid כתב בProgressBar בWPF תוך כדי פעולת thread:

                  ספציפית לבעיה הזאת מן הסתם גוגל על task dispatcher progressbar יעזור לך,

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

                  אשמח מאוד אם מישהו ירחם עלי ויסביר לי מה הפתרון.

                  גמ"ח מידע מחשבים ואופיס

                  תגובה 1 תגובה אחרונה
                  0
                  • pcinfogmachP pcinfogmach

                    @dovid

                    private async void search(string[] files)
                    {
                        progressBar.Maximum = files.Length;
                        List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>();
                        foreach (string file in files)
                        {
                            searchTasks.Add(Task.Run(() =>
                            {
                                this.Dispatcher.Invoke(() =>
                                {
                                    progressBar.Value = progressBar.Value + 1;
                                    File.ReadAllLines(file);
                                });
                            }));
                        }
                        await System.Threading.Tasks.Task.WhenAll(searchTasks);
                        progressBar.Value = 0;
                    }
                    
                    קומפיונטק מנותק
                    קומפיונטק מנותק
                    קומפיונט
                    כתב ב נערך לאחרונה על ידי קומפיונט
                    #10

                    @pcinfogmach כתב בProgressBar בWPF תוך כדי פעולת thread:

                    private async void search(string[] files)
                    {
                        progressBar.Maximum = files.Length;
                        List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>();
                        foreach (string file in files)
                        {
                            searchTasks.Add(Task.Run(() =>
                            {
                                this.Dispatcher.Invoke(() =>
                                {
                                    progressBar.Value = progressBar.Value + 1;
                                    File.ReadAllLines(file);
                                });
                            }));
                        }
                        await System.Threading.Tasks.Task.WhenAll(searchTasks);
                        progressBar.Value = 0;
                    }
                    

                    למה File.ReadAllLines(file) נמצא בתוך הקריאה ל Dispatcher.Invoke ? תנסה להוציא אותו מחוץ ל Dispatcher, הקריאה אמורה להכיל קוד שמשנה את התצוגה בלבד. הגיוני שהתרד של התצוגה נתקע כי את מריץ עליו עוד לוגיקה שלא קשורה ל UI שיתכן שגוזלת זמן, ובגלל שה UI לא מגיב אתה לא רואה את ההתקדמות. (חוץ מזה שצריך לאפס את progressBar.Value לאפס, מה ש @dovid כתב לך)

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

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

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      תגובה 1 תגובה אחרונה
                      0
                      • Aharon 0A מנותק
                        Aharon 0A מנותק
                        Aharon 0
                        כתב ב נערך לאחרונה על ידי
                        #12

                        עדיין צפוי לך בעיות בקוד, תתחיל מזה שתעטוף את הקוד ב try ו catch, ולפי השגיאה שתקבל תחפש את הפיתרון.

                        תגובה 1 תגובה אחרונה
                        -1
                        תגובה
                        • תגובה כנושא
                        התחברו כדי לפרסם תגובה
                        • מהישן לחדש
                        • מהחדש לישן
                        • הכי הרבה הצבעות


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

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

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