Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
1

Как закинуть нужные расчеты в отдельный поток

13.08.2012, 18:06. Показов 2678. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вообщем считаю что так и должно быть так как она читает\читает\читает.
//все норм и с памятью и с алгоритмом

Как сделать что бы форма не висла? Думаю закинуть нужные расчеты в отдельный поток.

Добавлено через 36 секунд
То-есть что я продолжал работу с ней.Например текст вводил в боксы.
0
13.08.2012, 18:06
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.08.2012, 18:06
Ответы с готовыми решениями:

Как из документа из нескольких страниц выбрать нужные строчки в отдельный файл?
Есть документ, сканированный,распознанный. Состоит из 50 страниц.На каждой странице есть по нескольку строчек (например:строчка марка,...

Как вывести в отдельный поток?
Вот код программы. Прога щелкает мышкой в определенные координаты экрана, через определенный промежуток времени заданный в ...

Как запустить отдельный поток
Как запустить часть кода в отдельном потоке. Пробовал так: public void func (){ this.Invoke((MethodInvoker)delegate(){ ...

21
 Аватар для LeniumSoft
1454 / 846 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
13.08.2012, 18:15 2
Цитата Сообщение от Noob.net Посмотреть сообщение
Думаю закинуть нужные расчеты в отдельный поток
хм Ну закидывай!
1
 Аватар для bumbaram
47 / 47 / 9
Регистрация: 13.02.2012
Сообщений: 176
13.08.2012, 18:24 3
Решить, только дополнительным потоком.
Смотри в сторону BackgroundWorker или через Task в TPL там еще проще.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 18:35  [ТС] 4
а с BackgroundWorker вот сюда _DoWork надо пихать свои методы?
А я то думал,как его использовать,System/Thread есть,зачем еще

принцип тот же что и с потоками? и приостанавливать могу?

Добавлено через 1 минуту
Поскольку фоновая операция выполняется в отдельном потоке, в ее коде не допускаются манипуляции с элементами формы.
То-есть я не смогу в прогресБар кидать прогресс?
0
 Аватар для bumbaram
47 / 47 / 9
Регистрация: 13.02.2012
Сообщений: 176
13.08.2012, 18:42 5
Принцип тот же что и с потоками, если с ними раньше работал, только даже лучше То есть все что можно там, можно и тут.
Прочитай на msdn там как раз пример с прогресс баром
http://msdn.microsoft.com/ru-r... orker.aspx
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 18:55  [ТС] 6
Не могу понять,можно его остановить а потом запустить с того же места?
Потоку мы говорим Sleep,а вот BackgroundWarker так не умеет(

Добавлено через 3 минуты
Иду к истокам(потокам хД),пока никто не остановил

Добавлено через 28 секунд
А и прогресс все равно самому считать,не в топку
0
Неадекват
 Аватар для freeba
1497 / 1234 / 247
Регистрация: 02.04.2010
Сообщений: 2,804
13.08.2012, 22:49 7
Цитата Сообщение от Noob.net Посмотреть сообщение
Не могу понять,можно его остановить а потом запустить с того же места?
А зачем? Расход лишних ресурсов, если требуется возможность паузы, то сохраняем промежуточный результат расчетов, а потом запускаем BW уже не с начала.

Прогресс в любом случае вручную считать, но BW имеет одно несравненное преимущество - прозрачное межпоточное взаимодействие. Чтобы отобразить прогресс или получить данные из потока не придется заморачиваться с Invoke'ми. Да и код получается более компактным и коротким нежели при кодинге ручками через Thread'инги.
1
Неадекват
 Аватар для freeba
1497 / 1234 / 247
Регистрация: 02.04.2010
Сообщений: 2,804
13.08.2012, 22:59 8
Вот небольшой пример использования BW.
Вложения
Тип файла: zip testBWForum.zip (43.6 Кб, 13 просмотров)
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:12  [ТС] 9
Спасибо) уже сделал и так и так)
Расчеты связаны с файлами по-этому не все так просто)
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:14 10
Цитата Сообщение от Noob.net Посмотреть сообщение
А и прогресс все равно самому считать,не в топку
BackgroundWorker'у его тоже надо считать.

Добавлено через 39 секунд
Цитата Сообщение от freeba Посмотреть сообщение
Прогресс в любом случае вручную считать, но BW имеет одно несравненное преимущество - прозрачное межпоточное взаимодействие. Чтобы отобразить прогресс или получить данные из потока не придется заморачиваться с Invoke'ми. Да и код получается более компактным и коротким нежели при кодинге ручками через Thread'инги.
А, не увидел
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:14  [ТС] 11
У мя через потоки получилось меньше кода =)
А где инфу почитать о потоках и ихнем Invoke
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:17 12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public partial class MainForm : Form
    {
        void SetTotalProgressMax(int max) //Можно вызывать из другого потока
        { 
            if (InvokeRequired)
                Invoke((Action<int>)SetTotalProgressMax, max);
            else
                prbTotal.Maximum = max;
        }
 
        void SetCurrentProgressValue(int value) //Можно вызывать из другого потока
        {
            if (InvokeRequired)
                Invoke((Action<int>)SetCurrentProgressValue, value);
            else
                prbCurrentProgress.Value = value;
        }
    }
Добавлено через 1 минуту
Апдейт. Исправил чуток на более нормальный вариант.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:21  [ТС] 13
Цитата Сообщение от Casper-SC Посмотреть сообщение
new WaitCallback(SetTotalProgressMax)
Вижу,это наш делегат.
А выполняется(Инвоук) он в том потоке в котором вызван или в главном?

Добавлено через 3 минуты
Цитата Сообщение от Casper-SC Посмотреть сообщение
if (InvokeRequired)
Так понимаю,нужно если доступ из другого потока?
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:23 14
Цитата Сообщение от Noob.net Посмотреть сообщение
Вижу,это наш делегат.
А выполняется(Инвоук) он в том потоке в котором вызван или в главном?
Я уже раз 10 код отредактировал. Это просто с старого одного проекта. Поправил и сделал более нормально.

Добавлено через 49 секунд
Цитата Сообщение от Noob.net Посмотреть сообщение
Так понимаю,нужно если доступ из другого потока?
Да. Если иногда нужно обновлять значение из другого потока, то метод такой пригодится.

Добавлено через 34 секунды
Можно вообще несколько универсальных сделать и ими пользоваться.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:23  [ТС] 15
(Action<int>) - передает локальную переменную?
нет..что-то не то тут
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:28 16
Цитата Сообщение от Noob.net Посмотреть сообщение
(Action<int>) - передает локальную переменную?
Это вместо
C#
1
Invoke(new Action<int>(SetCurrentProgressValue), value);
Есть ли по факту разница сам не знаю, не смотрел IL код или где там надо смотреть...
C#
1
Invoke((Action<int>)SetCurrentProgressValue, value);

Смотри. Если вызвали метод с основного потока, то выполнится блок else, а если вызвали с другого потока, то метод рекурсивно вызовет сам себя через Invoke и уже выполнится во время второго вызова блок else, это просто сокращает кол-во строк кода, как минимум. Да и вполне себе вариант.
1
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:30  [ТС] 17
Понял,приведения типов)

Добавлено через 53 секунды
Там разница небольшая,если я правильно понял.Во 2 неявно вызывается тот же метод что и в 1.
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:32 18
Ну или так, думаю прошлые варианты красивее:
C#
1
2
3
4
5
6
7
8
9
10
11
        void SetCurrentProgressValue(int value) //Можно вызывать из другого потока
        {
            Action<int> action = new Action<int>((val) =>
                {
                    prbCurrentProgress.Value = val;
                });
            if (InvokeRequired)
                Invoke(action, value);
            else
                action(value);
        }
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
13.08.2012, 23:35  [ТС] 19
Не это уже на извращение похоже..,хотя на счет функционала не скажу.
Но вот когда перейду хотя бы на 3 фрейм - поддержу)
0
Эксперт .NET
 Аватар для Casper-SC
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
13.08.2012, 23:40 20

Не по теме:

Цитата Сообщение от Noob.net Посмотреть сообщение
Но вот когда перейду хотя бы на 3 фрейм - поддержу)
А что мешает переходу сейчас?



Добавлено через 20 секунд
Цитата Сообщение от Noob.net Посмотреть сообщение
Не это уже на извращение похоже..,хотя на счет функционала не скажу.
Ну да, скорее так и есть, по крайней мере выглядит внешне.
0
13.08.2012, 23:40
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2012, 23:40
Помогаю со студенческими работами здесь

Как сделать отдельный поток в C++?
Скажите как сделать отдельный поток в C++

Как создать отдельный поток ?
Привет Как вызвать функцию WriteBlockSe в новом потоке, а то форма тормозит. Заранее спасибо public void...

Как вынести подключение к БД в отдельный поток?
Как вынести подключение бд в отдельный поток???Вот код программы: import android.os.Bundle; import android.view.View; import...

Как поместить контрол в отдельный поток?
Привет. С потоками толком не работал, только пробовал. В UserControl постоянно засылаются данные, которые надо обработать и вывести...

Функция класса, как отдельный поток
когда у всех возникает необходимость работать с нитями (threads) в windows, пользуются функцией CreateThread, если подразумевается...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Микросервис с нуля на Go с Kafka
stackoverflow 12.02.2025
Когда я впервые столкнулся с необходимостью разделить монолитное приложение на микросервисы, передо мной встал вопрос выбора правильных технологий и подходов. После долгих экспериментов с различными. . .
Микросервис с нуля на C# с RabbitMQ
stackoverflow 12.02.2025
Переход от монолитной архитектуры к микросервисной - это не просто модное веяние, а закономерный этап эволюции программных систем. В отличие от монолита, где все компоненты тесно связаны между собой. . .
Docker для начинающих
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения все чаще возникает необходимость быстро и надежно разворачивать приложения в различных средах. Разработчики постоянно сталкиваются с проблемой. . .
Создание бота для Телеграм на C#
stackoverflow 12.02.2025
В современном мире корпоративных коммуникаций Telegram-боты становятся незаменимым средством автоматизации бизнес-процессов и взаимодействия с сотрудниками. Как создать такого бота, который сможет. . .
Операторы сравнения (== и ===) в JavaScript
hw_wired 12.02.2025
JavaScript предоставляет два основных оператора сравнения - оператор нестрогого равенства (==) и оператор строгого равенства (===). На первый взгляд они могут показаться очень похожими, но их. . .
Определение адреса, откуда репозиторий Git был клонирован
hw_wired 12.02.2025
Система контроля версий Git хранит всю информацию о репозитории в специальной директории . git, включая данные об удаленных источниках. Эта информация необходима для синхронизации изменений между. . .
Объединение нескольких коммитов Git в один
hw_wired 12.02.2025
Представьте, что вы работаете над новой функциональностью и создали десяток небольших коммитов: исправление опечатки, форматирование кода, добавление комментариев, реализация основной логики. Каждый. . .
Как добавить локальную ветку в удалённый репозиторий Git
hw_wired 12.02.2025
Локальная ветка в Git - это изолированная линия разработки, существующая только на вашем компьютере. Представьте себе дерево с множеством веток - каждая ветка может расти в своем направлении, не. . .
Статическое отражение в C++
stackoverflow 12.02.2025
Статическое отражение представляет собой мощный механизм, позволяющий программам анализировать и манипулировать своей собственной структурой во время компиляции. Эта возможность открывает. . .
C++ в 21 веке - Бьярне Страуструп
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения C++ продолжает оставаться одним из ключевых языков программирования, несмотря на свой солидный возраст - более 45 лет с момента создания. За это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru