Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31

Зависает программа, хотя используется BeginInvoke, и всё должно считаться в другом потоке

29.06.2012, 06:57. Показов 5657. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть программа которая моделирует физ процесс, иногда делает это долго, чтобы на форму не ставилось Программа не отвечает, решил вынести расчет в отдельный поток, но пока реализовать это не смог. Просто в процессе счета хочу ещё знать сколько она выполнила% от всего объема.
свойства BeginInvoke узнал отсюда http://krez0n.org.ua/archives/686
Итак по нажатию кнопки идет расчет.
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
 
delegate void SomeDelegateOne(int TTT, double K_pll, double K_mcc, double porositty, double Sff, double Cleftt, double Crightt,double Tempeature,double[] Rx, double[] Sx, double[] Cx, double[] Resx);
private void Solve_Click(object sender, EventArgs e)
{
            TaskInfo.Enabled = true;
            TaskInfo.Text = "Solving HydroDynamic Problem";
            TaskInfo.Refresh();//вывели информацию
 
            HDR g = new HDR();// элемент класса с нужными методами
            g.part_input = part_inputG;//определили имя нужного файла config;
            g.GetRn(out Nxr);//получили число точек по осиX
            Rx = new double[Nxr]; Sx = new double[Nxr]; Cx = new double[Nxr]; Resx = new double[Nxr]; //получаемые данные из метода g
 
            g.TypeZvnz = TypeZvnz;//параметры задачи
            g.TypeRes = TypeResa;
 
            //g.runSolver2(T, K_pl, K_mc, porosity, Sf, Cleft, Cright, Temp, Rx, Sx, Cx, Resx);-сам метод, 
 
            SomeDelegateOne sd = g.runSolver2; // создаем делегат
            IAsyncResult asyncRes = sd.BeginInvoke(T, K_pl, K_mc, porosity, Sf, Cleft, Cright, Temp, Rx, Sx, Cx, Resx, null, null); // вызываем метод -  расчет физ задачи, может считать долго!
            //Проверяем IAsyncResult.IsCompleted
            while (asyncRes.IsCompleted == false)
            {
                prog = g.Progress;//получаем текущее стояние решения задачи
                TaskInfo.Text = "task to End " + prog + "% of full calculation";
                TaskInfo.Refresh();
                Thread.Sleep(500);  // эмулируем работу метода ? 
 
            }
            sd.EndInvoke(asyncRes);
//дальше обрабатываем полученные результаты.
 
  }
C#
1
       Thread.Sleep(500);  // эмулируем работу метода ?
-эту строку я взял из шаблона, может из-за него и виснет приложение? какой потом засыпает основной?
но даже без него всё равно приложение виснет, наверно как-то по другому надо обрабатывать асинхронный вывод данных.
то есть мониторить процесс расчета и одновременно делать активным форму не возможно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2012, 06:57
Ответы с готовыми решениями:

Зависает окно cmd, хотя не должно
Так, вообщем суть в том, что у меня есть некая гениальная консольная программа. мне нужно писать в лог все что она там напишет. но вот...

Программа виснет при выполнении действий в другом потоке
Пишу приложение WPF. Мне необходимо, чтобы при нажатии на кнопку выполнялись в фоне какие-либо действия. Вот к примеру функция: void...

Зависает программа при работе в потоке
Здравствуйте. При попытке найти и скопировать много файлов (в потоке), основной поток программы не отвечает. Посмотрите пожалуйста, можно...

34
194 / 193 / 17
Регистрация: 07.11.2010
Сообщений: 477
03.07.2012, 17:05
Студворк — интернет-сервис помощи студентам
Возможно, что это поможет по данной теме:
https://www.cyberforum.ru/csha... ost1127690
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
03.07.2012, 19:46  [ТС]
Цитата Сообщение от Leax Посмотреть сообщение
Возможно, что это поможет по данной теме:
https://www.cyberforum.ru/csha... ost1127690
спасибо, почитаю. может так получится лучше, у меня уже считате в отдельном потоке но пока ничего из этого потока вытащить не могу
я тоже подофигел когда пропотоки узнал,
0
216 / 216 / 20
Регистрация: 18.05.2010
Сообщений: 865
04.07.2012, 01:56
Цитата Сообщение от vaque Посмотреть сообщение
public void runSolver2(int TTT, double K_pll, double K_mcc, double porositty, double Sff, double Cleftt, double Crightt,double Tempeature,double[] Rx, double[] Sx, double[] Cx, double[] Resx)
{
int T_n = (int)(TTT * 60 * 60 / dt);//740584 определяет число шагов по времени
for (int t = 0; t < T_n; t++)
{
//решение уравнения для Y Z Col [1] на очередном шаге по времени
if (t % 10000 == 0)
Progress =(int)(Math.Round(( t / (TTT * 60 * 60 / dt)),2)*100);
}
}
вот здесь добавте, примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void runSolver2(int TTT, double K_pll, double K_mcc, double porositty, double Sff, double Cleftt, double Crightt,double Tempeature,double[] Rx, double[] Sx, double[] Cx, double[] Resx)
         {
            int T_n = (int)(TTT * 60 * 60 / dt);//740584 определяет число шагов по времени
 
            this.Invoke(new Action(() => this.progress1.Value = 0));
            this.Invoke(new Action(() => this.progress1.Minimum = 0));
            this.Invoke(new Action(() => this.progress1.Maximum = T-n));
 
            for (int t = 0; t < T_n; t++)
            {
                //решение уравнения для Y Z Col [1] на очередном шаге по времени
                
                this.Invoke(new Action(() => this.progress1.Value = i));
 
                if (t % 10000 == 0) 
                    Progress =(int)(Math.Round(( t / (TTT * 60 * 60 / dt)),2)*100);
            }
        }
погрессбар должен быть у вас на форме
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
04.07.2012, 05:53  [ТС]
Цитата Сообщение от Башир Посмотреть сообщение
вот здесь добавте, примерно так
C#
1
public void runSolver2(int TTT, double K_pll, double K_mcc, double porositty, double Sff, double Cleftt, double Crightt,double Tempeature,double[] Rx, double[] Sx, double[] Cx, double[] Resx)
погрессбар должен быть у вас на форме
так этот метод в другом классе: HDR
А форма находиться в класcе Flowvizer:Form.(Namespace у них одно)
В методе класса HDR не видно ни полей(контролов) формы, ни Invoke
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2012, 11:24
Цитата Сообщение от vaque Посмотреть сообщение
так этот метод в другом классе: HDR
А форма находиться в класcе Flowvizer:Form.(Namespace у них одно)
В методе класса HDR не видно ни полей(контролов) формы, ни Invoke
Сделайте событие в классе HDR, уведомляющее подписчиков о прогрессе.
В форме отлавливайте это событие и там уже делайте что хотите: выводите в консоль, обновляйте прогресс бар, жарьте карри и пр.
0
216 / 216 / 20
Регистрация: 18.05.2010
Сообщений: 865
04.07.2012, 13:20
Цитата Сообщение от vaque Посмотреть сообщение
так этот метод в другом классе: HDR
А форма находиться в класcе Flowvizer:Form.(Namespace у них одно)
В методе класса HDR не видно ни полей(контролов) формы, ни Invoke
Все как то не так )) такое чеувство что весь прект надо с вами разбирать ))) в список параметров добавте ссылку на форму и вот вам ссылка на Invoke и прогрессбар, либо то что сказал
kolorotur,
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
04.07.2012, 15:16  [ТС]
Цитата Сообщение от Башир Посмотреть сообщение
Все как то не так )) такое чеувство что весь прект надо с вами разбирать ))) в список параметров добавте ссылку на форму и вот вам ссылка на Invoke и прогрессбар, либо то что сказал
kolorotur,
вы имеете ввиду что в список параметров метода solver2 добавить ссылку на форму?
да так легче будет, попробую.

Добавлено через 29 минут
у меня получилось!
могу отблагодарить за помощь!(теперь очень стильно ползет прогресс бар)
http://www.youtube.com/watch?v=id5sOrGljt0
Какие книги посоветуете почитать на досуге(попрактиковаться)?
Я изучаю язык самостоятельно, и прочитал с примерами только Герберт Шилдт - C# Учебный Курс, но там про консольные приложения только.
тему можно закрыть,
теперь осталось с процедурами фортрана разобраться(как предавать им массив,), чтобы этих черных консольных приложений не возникало.
0
216 / 216 / 20
Регистрация: 18.05.2010
Сообщений: 865
04.07.2012, 22:53
Но правильнее все таки сделать событие в классе HDR как сказал kolorotur, я вам просто показал что существуют масса способов, но в ООП правильнее использовать событие и подписаться на него с формы. В этом случае можно с любой формы изменять свой прогресс бар или все что угодно.
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
06.07.2012, 09:19  [ТС]
Давайте попробуем, теперь у меня обработчик событий ProcesingEvent не видит форму
класс с методом расчета
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace study_event_using
{
    delegate void Del(int r);
    class SLV
    {
        int Progress;
        string name;
        public event Del EventCal;
        public SLV(string m)
        {
            name = m;
        }
        public double Calculation(double q,int r)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(50);  // sleeping
                if (i % 10==0) { if (EventCal != null)       EventCal(i); }
            }
            return  Math.Pow(q, r);
        }
    }
}
класс анализа результатов и показа степени решенности хода расчета.
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.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace study_event_using
{
    public partial class Form1 : Form
    {
        int prog;//информация о стостоянии расчета
        delegate double SomeDelegateOne(double q, int r);//делегат для запуска в отдельном потоке
        public Form1()
        {
            InitializeComponent();
        }
        static void ProcesingEvent(int r)
        {
            //l.Text = "измеиться поле"; но не видно форму!!
        }
        private void Complete(IAsyncResult ar)
        {
            //l.Text = "Completed"; Здесь тоже не видно форму!!
            System.Runtime.Remoting.Messaging.AsyncResult result = (System.Runtime.Remoting.Messaging.AsyncResult)ar;
            SomeDelegateOne sumInt = (SomeDelegateOne)result.AsyncDelegate;
            int resultSum = (int)(sumInt.EndInvoke(ar));
            MessageBox.Show(string.Format("Этот поток закончил расчет. Сумма равноа {0} и прислал {1}", resultSum, ar.AsyncState));
  
        }
 
        private void go_Click(object sender, EventArgs e)
        {
            SLV CL = new SLV("Пионер");
            CL.EventCal += new Del(ProcesingEvent);
            SomeDelegateOne hr = CL.Calculation;
            hr.BeginInvoke(4, 6, this.Complete, "<Данные>");
  
        }
        
    }
}
как увидеть поля формы в обработчике?
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
06.07.2012, 10:18
ну у вас же ProcessingEvent static'ом объявлено, оно так и не увидит
1
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
06.07.2012, 10:28  [ТС]
Цитата Сообщение от Монфрид Посмотреть сообщение
ну у вас же ProcessingEvent static'ом объявлено, оно так и не увидит
да, тонкости убрал статик. Теперь (в обработчике события Processing) при l.text=''изменили"; ошибка при обращение к полю формы.
пишет что перекрестная ссылка на объект созданный другим потоком. Что-то хитрее надо использовать,

Добавлено через 5 минут
изменил, и теперь по штуке
this.Invoke(new Action(()=>this.l.Text=r+"% completed"));
получается.
Что тогда такое Invoke? он что делает связку с основным рабочим потоком и туда передает данные, или временно их привносит во второй поток, изменяет и отправляет на форму?
поразительно красивые вещи получаются
буду пример теперь переносить на основную программу.
0
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
06.07.2012, 10:31
там через invoke наверно надо, если пишет что из др. потока обращение..
типа такого:
C#
1
2
3
4
5
6
7
if (l.InvokeRequired)
 l.Invoke((new MethodInvoker(() =>
                {
 l.Text="jhjkhj";
                }));
else
l.Text="kljlkjl";
о, вы уже разобрались сами
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
06.07.2012, 11:26  [ТС]
Цитата Сообщение от Монфрид Посмотреть сообщение
там через invoke наверно надо, если пишет что из др. потока обращение..
типа такого:
C#
1
2
3
4
5
6
7
if (l.InvokeRequired)
 l.Invoke((new MethodInvoker(() =>
                {
 l.Text="jhjkhj";
                }));
else
l.Text="kljlkjl";
о, вы уже разобрались сами
да там в начале текста была речь об этом просто я чуть лучше понял то что использую.
Спасибо
0
216 / 216 / 20
Регистрация: 18.05.2010
Сообщений: 865
06.07.2012, 13:27
Цитата Сообщение от vaque Посмотреть сообщение
Давайте попробуем, теперь у меня обработчик событий ProcesingEvent не видит форму
А ему и не надо видеть форму. Это форме надо подписаться на это событие и в форме обрабатывать изменение прогресс бара.
0
3 / 3 / 1
Регистрация: 22.04.2011
Сообщений: 31
08.07.2012, 12:56  [ТС]
Цитата Сообщение от Башир Посмотреть сообщение
А ему и не надо видеть форму. Это форме надо подписаться на это событие и в форме обрабатывать изменение прогресс бара.
обработчик события был создан в классе с формой, но в прочем я уже решил это вопрос.
всё работает, спасибо большое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2012, 12:56

Dispatcher.BeginInvoke: обновление данных в ListView в отдельном потоке
При нажатии на кнопку &quot;Refresh&quot; пытаюсь сделать так, чтобы информация для отображения в ListView, собиралась в другом потоке (Формирую...

Говорит что TextBox в другом потоке чем сама программа. белеберда
Белеберда, данные получает отлично и я их вижу через консоль. а выводить в текстбокс отказывается, public partial class MainWindow:Window...

В результате вычислений программа выдает нули(хотя так не должно быть)
Программа должна посчитать некоторые две величины по формулам, которые проверены аналитически, конечно. Но в результате вычислений одна из...

Чистильщики все время находят кеш в IE, хотя этот браузер не используется
Добрый день! На рабочем компе периодически прибираюсь программами CCleaner и WiseCare365, и каждый раз они находят кучу ненужных файлов, в...

есть вложенный класс который является другом объемлюющего и всё это должно компилиться.
Сперва логика: Есть класс matrix. И есть класс diagonal; так я поразмыслил и пришёл к выводу, что объект diagonal в отрыве от объекта...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru