Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 2
Регистрация: 22.12.2014
Сообщений: 159
.NET 4.x

Не срабатывает делегат и метод Invoke

11.04.2015, 12:02. Показов 1912. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем. Товарищи такая беда, сообразить не могу поэтому прошу вашей помощи.
Есть метод в котором выполняется поток
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public decimal privat; 
 
public void Working() // название метода
 
        {
 
 while (work)  // пока идет работа
    {
        lock (this)
        try
        {
           Invoke(new EventHandler(delegate
            {
                privat = (Convert.ToDecimal(label7.Text) / progressBar1.Maximum);  // считывает соотношение необходимых мне строк к общему количеству строк загруженных строк из текстового файла.
                label50.Text = string.Format("{0:0.0%}", privat); // выдает мне эту информацию в виде текста на label50.
            }));
     Invoke(new EventHandler(delegate
       {
         conv = (decimal)progressBar1.Value/progressBar1.Maximum; // Тут процент выполненной работы 
        label46.Text = Convert.ToInt32(conv*100)+@" %";})); // отображает процент выполненной работы на label46
           Invoke(new EventHandler(delegate { progressBar1.Increment(+1); })); // увеличивает значение прогрессбара на 1
}
 
 
 private void Start_Click(object sender, EventArgs e) // По нажатию на кнопку старт запускаются потоки.
        {
                work = true;
                manager = new JobManager(Working);  // это из библиотеки Viking.Engine создает поток
                manager.PreferredThreadCount = (int) threadbox.Value;
                manager.JobCompleted += (obj, args) => MessageBox.Show(args.Reason + @"");
                manager.Start();
}
А суть вот в чём у меня всё налеплено в Form1.cs. Есть в программе 3 tabcontrol элемента и всё их содержимое одинаковое и код одинаковый, но поскольку я не умею пока составлять правильную структуру программы то тупо просто беру делаю копипаст методов и изменяю там параметры необходимые и имена элементов.
C#
1
2
3
4
5
6
7
//То есть для одной как бы программы у меня метод
public void Working()
//для второй
public void Working2()
{
//и тут код такой же как и в Working
}
И беда в том, что метод Invoke в методе Working работает всё проценты показывает, процент выполненной работы показывает всё в общем работает. Но при этом в методе Working2, если скопипастить вот этот код ничего работать не будет, но если я запущу из первого controltab'а программу то есть метод Working то мне в третьем controltab'е начинает отображать информацию из первого, то есть каким то образом Invoke(new EventHandler(delegate привязывается в любом случае к методу Working. Хоть я 10 раз скопирую и переименую этот метод всё равно делегат работать не будет пока я не запущу первую программу с методом Working. Хотя имя потока я изменил на другое и имя метода тоже. И вот я не могу понять почему оно именно привязывается к самому первому методу и потоку созданному там.
C#
1
2
3
4
5
6
7
8
9
10
   Invoke(new EventHandler(delegate
            {
                privat = (Convert.ToDecimal(label7.Text) / progressBar1.Maximum);  // считывает соотношение необходимых мне строк к общему количеству строк загруженных строк из текстового файла.
                label50.Text = string.Format("{0:0.0%}", privat); // выдает мне эту информацию в виде текста на label50.
            }));
     Invoke(new EventHandler(delegate
       {
         conv = (decimal)progressBar1.Value/progressBar1.Maximum; // Тут процент выполненной работы 
        label46.Text = Convert.ToInt32(conv*100)+@" %";})); // отображает процент выполненной работы на label46
           Invoke(new EventHandler(delegate { progressBar1.Increment(+1); })); // увеличивает значение прогрессбара на 1
Добавлено через 20 часов 23 минуты
Или может кто подскажет как сделать проценты на прогрессбаре ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2015, 12:02
Ответы с готовыми решениями:

Почему делегат не вызывает метод без Invoke
Есть такой код public delegate bool IsPlaying(); private readonly IsPlaying _isPlaying; Почему так не работает ...

Dispatcher.Invoke() не вызывает указанный делегат
Метод MethodForThread() работает в другом потоке и по окончании он должен вызвать обратный метод AsyncCallbackMethod() в потоке, в котором...

Метод принимающий делегат
Написать статический метод, возвращающий количество элементов одномерного массива целых чисел. Параметры: массив целых чисел, заданный...

5
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.04.2015, 14:11
C#
1
2
double progress = 0.1; // 10%
string progressVal = progress.ToString("P");
0
1 / 1 / 2
Регистрация: 22.12.2014
Сообщений: 159
11.04.2015, 23:05  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
double progress = 0.1; // 10% string progressVal = progress.ToString("P");
Понять только не могу каким макаром это к прогрессбару относится ?
При изменении значения Value прогресс бара добавлять 0,1 или как ?
У меня значение maximum равно кол-ву загружаемых строк в софт, при срабатывании события, к Value прогресс бара добавляется единица, таким образом когда работа завершена value прогресс бара будет равно значению maximum (то есть потоки выполнили всю работу 100%). Соответственно на данный момент я о прогрессе работы потоков узнаю делением (decimal) Value/Maximum*100. И беда еще одна в том что label тоже не присобачишь, потому как, если указать ему background color Transparent, то задний фон берется из цвета формы соответственно, если его на прогресс баре поместить то будет заливка цвета фона.
C#
1
2
3
4
5
6
7
8
9
10
11
 Invoke(new EventHandler(delegate
                           {
                               progressBar2.Increment(+1);
                            }));
 
 Invoke(new EventHandler(delegate
                           {
 
                               int percent = (int)((progressBar2.Value / (double)progressBar2.Maximum) * 100);
                               progressBar2.CreateGraphics().DrawString(percent + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Coral, new PointF(progressBar2.Width / 2 - 10, progressBar2.Height / 2 - 7));
                           }));
Пока пришел к такому решению, но опять беда при каждом срабатывании события оно строку с процентами перерисовывает и получается что проценты появляются, исчезают, появляется новое значение опять прорисовывает заново (получается как бы мерцает постоянно). А про 0,1 вообще чё т непонятно.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.04.2015, 05:23
eastsida, ты хочешь прямо на прогресс-баре рисовать что ли?

Ну и лучше не просто кастовать к инту, а округлять наверное
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.04.2015, 05:42
Можно сделать такой контрол:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 class ProgressBarDetailed : ProgressBar
    {
        public enum Mode
        {
            Percentage,
            CustomText
        }
 
        public Mode DisplayMode { get; set; }
        public string CustomText { get; set; }
 
        public ProgressBarDetailed()
        {
            // Modify the ControlStyles flags
            //http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx
            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle);
            ClientRectangle.Inflate(-3, -3);
            if (Value > 0)
            {
                Rectangle clip = new Rectangle(ClientRectangle.X, ClientRectangle.Y, (int)Math.Round(((float)Value / Maximum) * ClientRectangle.Width), ClientRectangle.Height);
                ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, clip);
            }
            string text = DisplayMode == Mode.Percentage ? ((double)(Value - Minimum)/(Maximum - Minimum)).ToString("P") : CustomText;
            using (Font f = new Font(FontFamily.GenericSerif, 10))
            {
                SizeF len = e.Graphics.MeasureString(text, f);
                Point location = new Point(Convert.ToInt32((Width / 2) - len.Width / 2), Convert.ToInt32((Height / 2) - len.Height / 2));
                e.Graphics.DrawString(text, f, Brushes.Red, location);
            }
        }
    }
и юзать его вместо обычного. Просто на формочку кидаешь и всё.

Пример
Вложения
Тип файла: rar WindowsFormsApplication1.rar (62.7 Кб, 4 просмотров)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.04.2015, 07:43
Хотя лучше как-то так, но смысл тот же
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace ProgressBarTest
{
    class ProgressBarDetailed : ProgressBar
    {
        public enum Mode
        {
            Percentage,
            CustomText
        }
 
        public Mode DisplayMode { get; set; }
        public string CustomText { get; set; }
 
        public ProgressBarDetailed()
        {
            // Modify the ControlStyles flags
            //http://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx
            SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle);
            ClientRectangle.Inflate(-3, -3);
            double progress = ((double)(Value - Minimum) / (Maximum - Minimum));
            if (Value > 0)
            {
                Rectangle clip = new Rectangle(ClientRectangle.X, ClientRectangle.Y, (int) Math.Round(ClientRectangle.Width * progress), ClientRectangle.Height);
                ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, clip);
            }
            string text = DisplayMode == Mode.Percentage ? progress.ToString("P") : CustomText;
            using (Font f = new Font(FontFamily.GenericSerif, 10))
            {
                SizeF len = e.Graphics.MeasureString(text, f);
                PointF location = new PointF((float) Math.Round(Width/2.0 - len.Width/2.0), (float) Math.Round(Height/2.0 - len.Height/2));
                e.Graphics.DrawString(text, f, Brushes.Red, location);
            }
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2015, 07:43
Помогаю со студенческими работами здесь

Делегат не видит метод
Делегат не видит метод который я ему передаю. ниже в коде я отметил место где происходит передача. using System; using...

Метод подписывается на делегат, а не на event
Здравствуйте, в книгах написано, что делегат нужен для event: создаётся делегат, потом создаётся event, затем подписываем метод на event. В...

Передать делегат (заранее неизвестный) в метод
Сразу к сути: нужно передать делегат (заранее не известный) в нутрь метода для использования - пытаюсь так: public static void...

Вытащить метод через рефлексию в Делегат
Проблема с тем, чтобы вытащить метод через рефлексию. IL дамп заголовка метода метода: .class public sequential ansi serializable...

Вызвать метод через делегат в словаре
Приветствую. Запутался в синтаксисе. Как мне вызвать метод из словаря и вернуть массив дат? Думаю из скрина будет понятно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru