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

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

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

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

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

    יש לי קוד ב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 תגובה 1 תגובה אחרונה
    0
    • 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
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום