Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2014, 20:49   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию Фриз Формы

Уважаемые, подскажите в чем может быть причина фриза формы, если использую backgroundworker и простые потоки ?

Т.е. воркер запускает создание простых потоков(10 штук), которые в свою очередь выводят значение от 1 до 100.
L6go1as вне форума Ответить с цитированием
Старый 01.11.2014, 21:09   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну код смотреть надо. Наверно слишком часто выводят.

И я б рекомендовал использовать Task/TPL вместо BW и Thread.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 21:16   #3
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну код смотреть надо. Наверно слишком часто выводят.

И я б рекомендовал использовать Task/TPL вместо BW и Thread.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication3
{
    public delegate void TestDelegate(string text);
    public partial class Form1 : Form
    {
        private TestDelegate tg;
        private Threads thr;

        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
            backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        public void ShowText(string text)
        {
            
            if (InvokeRequired == true)
            {
                Invoke(tg, text);
                return;
            }
            textBox1.Text += text + Environment.NewLine;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

        public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
                tg = new TestDelegate(ShowText);
                thr = new Threads(tg);
                if (backgroundWorker1.CancellationPending == true)
                    {
                        thr.Abort();
                        e.Cancel = true;
                    }
                    thr.ThdeadsCreator(10);
        }

        public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                MessageBox.Show("Отмена!");
            }
            else { MessageBox.Show("Выполнил!"); }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace WindowsFormsApplication3
{
    public class Threads
    {
        List<Thread> ListOfThreads = new List<Thread>();
        private TestDelegate _tg;
        public Threads(TestDelegate tg)
        {
            _tg = tg;
        }

        public void ThdeadsCreator(int count_of_threads)
        {
            for (int i = 0; i < count_of_threads; i++)
            {
                Thread t = new Thread(WhatToDo);
                t.IsBackground = true;
                ListOfThreads.Add(t);
                ListOfThreads[i].Start();
            }
        }

        
        public void WhatToDo()
        {
            for (int i = 0; i < 100; i++ )
            {
                _tg(i.ToString());
                Thread.Sleep(100);
            }
        }

        public void Abort()
        {
            for (int i = 0; i < ListOfThreads.Count; i++)
            {
                ListOfThreads[i].Abort();
            }
            ListOfThreads.Clear();
        }
    }
}
А позволь поинтересоваться, в чем преимущество первой пары над второй ?
L6go1as вне форума Ответить с цитированием
Старый 01.11.2014, 21:44   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

У меня вроде не фризит ничего в этом коде, да и не видно ничего, что бы могло фризить тут. Проблема точно есть тут?)

Это не пара.

Тем, что это более высокий уровень абстракции, проще использовать, не надо с нуля кучу вещей велосипедить. Хотя бы самое простое: обработка исключений, возвращение результата, остановка, синхронизация (CancellationToken, TaskSheduler, ContinueWith, ...), а в C#5 еще и удобные async/await.

http://stackoverflow.com/questions/1...ad-differences
http://www.codeproject.com/Articles/...l-Library-of-n
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.11.2014 в 21:48.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 21:53   #5
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
У меня вроде не фризит ничего в этом коде, да и не видно ничего, что бы могло фризить тут. Проблема точно есть тут?)

Это не пара.

Тем, что это более высокий уровень абстракции, проще использовать, не надо с нуля кучу вещей велосипедить. Хотя бы самое простое: обработка исключений, возвращение результата, остановка, синхронизация (CancellationToken, TaskSheduler, ContinueWith, ...), а в C#5 еще и удобные async/await.

http://stackoverflow.com/questions/1...ad-differences
http://www.codeproject.com/Articles/...l-Library-of-n
Обязательно ознакомлюсь.
Что до фриза, то в момент выполнения работы я ее отодрать с места не могу. Ты поставь параметры поболе )

А вот еще вопросик, а можно ли отследить на всеми потоками и отследить "прогресс", если да, то как (желательно пример, ибо еще тяжко идет) )

Последний раз редактировалось L6go1as; 01.11.2014 в 21:55.
L6go1as вне форума Ответить с цитированием
Старый 01.11.2014, 22:28   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чего поболее? Оно ж просто выводит число каждые 100мс. Если убрать задержку и просто все время выводить, то конечно фризить будет.

Кстати, тут чтоб delegate не создавать можно Action использовать. http://msdn.microsoft.com/en-us/libr...vs.100%29.aspx
Код:
        void ShowText(string text)
        {
             ...
        }

        void SomethingThatWantsCallbackMethod(Action<string> act)
        {
             act("hello");
        }

        SomethingThatWantsCallbackMethod(ShowText);
А про прогресс непонятно что, где и как надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.11.2014 в 22:31.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как мне из формы, генерить другие формы, нажимая на кнопку? RISagitov Microsoft Office Excel 5 21.05.2012 00:57
Из DBGrid одной формы отразить в ListBox на другой формы VenZell БД в Delphi 2 28.05.2010 07:27
Заголовок Child формы имеет цвет неактивной формы, хотя форма активна? PrimaryPro Общие вопросы Delphi 0 12.03.2010 11:12
как привязать размеры содержимого формы к размерам самой формы acid_bmstu Общие вопросы Delphi 4 05.02.2010 05:02
Обращение из формы в dll к элементу главной формы (delphi) a_n_n_a Помощь студентам 3 10.05.2009 04:00