Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115

Зависают Формы, ничего не могу сделать с ними

26.02.2019, 22:41. Показов 1401. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При вызове форм происходит их отображение и последующее зависание
Код Form.1:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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;
using ZedGraph;
 
namespace Лаба2._1
{
    /*Форма Form1 для построения графиков,которая наследуется от класса Form,в котором описаны начальные инструкции*/
    public partial class Form1 : Form
    {
        private AutoResetEvent waitHandle;
        private double[] arrx;
        private double[] arry;
        private int i;
        /*Конструктор класса Form1*/
        public Form1(double[] arrx, double[] arry, int i,AutoResetEvent waitHandle)
        { 
                this.arrx = arrx;
                this.arry = arry;
                this.i = i;
            this.waitHandle = waitHandle;
        InitializeComponent();
        }
        public Form1()
        {
 
        }
        /*функция вычисления интерполяционного полинома лагранжа,которая принимает в аргументы значение x
         *и два одномерных массива x,y типа double*/
        public double Lagrange(double x0, double[] x, double[] y)
        {
            /*Объявление переменной polinom типа double и инициализация нулем*/
            double polinom = 0;
            /*Цикл вычисления интерполяционного полинома Лагранжа*/
            for (int j = 0; j < x.Length; j++)
            {
                /*Объявление переменной p типа double и инициализация единицей*/
                double p = 1;
                /*Цикл вычисление базисных полиномов*/
                for (int i = 0; i <x.Length; i++)
                    if (j != i)
                    {
                        /*Вычисление базисных полиномов по формуле Лагранжа*/
                        p *=  (x0 - x[i]) / (x[j] - x[i]);
                    }
                /*Вычисление интерполяционного полинома Лагранжа*/
                polinom += y[j] * p;
            }
            /*Возвращение значения polinom*/
            return polinom;
        }
        /*Функция,которая добавляет точки на график и рисует график функции,принимающая два массива x,y типа double*/
        public void DrawGraph(double[] x, double[] y,int n,AutoResetEvent waitHandler)
        {
            Console.WriteLine("Поток №{0}", Thread.CurrentThread.GetHashCode());
            /* Получим панель для рисования*/
            GraphPane pane = zedGraphControl1.GraphPane;
            pane.Title.Text = "Интерполяционный полином Лагранжа "+ i.ToString()+ "-й степени";            
            /*Предварительно очищаем панель*/
            pane.CurveList.Clear();
            /*Создадим список точек*/
            PointPairList list_1 = new PointPairList();
            PointPairList list_2 = new PointPairList();
            /*Заполняем список точек*/
            for (int i = 0; i < x.Length; i++)
            {
                list_1.Add(x[i], y[i]);
            }
 
            /*Интерполируем несколько точек между узлами*/
            for (int i = 0; i < x.Length-1 ; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    /*Объявляем переменную local типа double и присваиваем выражение,по которому вычисляется будущий x*/
                    double local = x[i] + j * (x[i + 1] - x[i])/n;
                    /*Заполнение списка точек,кроме последней точки,
                     *вызовом функции вычисления интерполяционного полинома Лагранжа*/
                    list_2.Add(local, Lagrange(local, x, y));
                }
            }
            /*Добавление последней точки в список*/
            list_2.Add(x[x.Length - 1], y[y.Length - 1]);
            /*Объявляем два экземпляра класса LineItem.Рисуем линии по точкам*/
            Console.WriteLine("Рисую график, пожалуйста, подождите");
            LineItem myCurve1 = pane.AddCurve("Исходная функция", list_1, Color.Purple, SymbolType.Diamond);
            LineItem myCurve2 = pane.AddCurve("Интерполяционный полином" , list_2, Color.Red, SymbolType.None);
            Console.WriteLine("График готов!");
            /* По оси Y установим автоматический подбор масштаба*/
            pane.YAxis.Scale.MinAuto = true;
            pane.YAxis.Scale.MaxAuto = true;
            /*Установим значение параметра IsBoundedRanges как true.
              Это означает, что при автоматическом подборе масштаба 
              нужно учитывать только видимый интервал графика*/
            pane.IsBoundedRanges = true;
            /*Обновляем данные об осях*/
            pane.AxisChange();
            /*Обновляем график*/          
            zedGraphControl1.Invalidate();
            waitHandle.Set();
             
 
 
        }
        /*private void zedGraphControl1_Load(object sender, EventArgs e)
        {
 
        }*/
 
        /*private void zedGraphControl1_Load(object sender, EventArgs e)
        {
 
        }*/
    }
 
}
Часть кода откуда идет вызов:
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
Form1 form = new Form1(arrx, arry, 2,waitHandle);
            Form1 form2 = new Form1(arrx, arry, 3,waitHandle);
            Form1 form3 = new Form1(arrx, arry, 4,waitHandle);
            Thread myThread1 = new Thread(() => form.DrawGraph(arrx, arry, 2,waitHandle));          
            myThread1.Start();
            waitHandle.WaitOne();
            myThread1.Name = "Полином 2-й степени";
            Console.WriteLine(myThread1.Name);
            Console.WriteLine("-------------------------------");
            form.Show();
            form.Update();           
            waitHandle2.Set();
            Thread myThread2 = new Thread(() => form2.DrawGraph(arrx, arry, 3,waitHandle));          
            myThread2.Start();
            waitHandle.WaitOne();
            myThread2.Name = "Полином 3-й степени";
            Console.WriteLine(myThread2.Name);
            Console.WriteLine("-------------------------------");
            form2.Show();
            form2.Update();
            waitHandle2.Set();
            Thread myThread3 = new Thread(() => form3.DrawGraph(arrx, arry, 4, waitHandle));      
            myThread3.Start();
            waitHandle.WaitOne();
            myThread3.Name = "Полином 4-й степени";
            Console.WriteLine(myThread3.Name);
            Console.WriteLine("-------------------------------");
            waitHandle2.Set();
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2019, 22:41
Ответы с готовыми решениями:

Зависают приложения KDE при их запуске и действиями с ними
Добрый день, проблема вынесена в сабж. Fedora 21, с некоторых пор (не могу сказать, после какого именно события) начались проблемы с...

Вообще ничего не могу сделать
Если не сможете рассмотреть картинку, могу в txt выложить

Cиний экран ничего не могу сделать
Люди добрые!! помогите,ноут при загрузке выдает ошибку,что там устанавливалось и что обновлялось или нет не знаю,ноут жены!ни в...

7
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
26.02.2019, 22:46  [ТС]
Вот скрин:
Миниатюры
Зависают Формы, ничего не могу сделать с ними  
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
27.02.2019, 00:57
Цитата Сообщение от artur31154 Посмотреть сообщение
При вызове форм происходит их отображение и последующее зависание
Чего и следовало ожидать... Они у Вас работают в основном потоке.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
27.02.2019, 14:57  [ТС]
asn31337, но ведь при выводе в консоли выводятся разные потоки, значит выполняют разные потоки, но если даже так, то как исправить?
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
27.02.2019, 15:14
Лучший ответ Сообщение было отмечено artur31154 как решение

Решение

Цитата Сообщение от artur31154 Посмотреть сообщение
ведь при выводе в консоли выводятся разные потоки
В разных потоках у Вас выполняются только методы DrawGraph. Сами же формы работают в основном потоке.

Цитата Сообщение от artur31154 Посмотреть сообщение
как исправить?
Прежде всего, нужно понять, что консольное приложение и WinForms приложение работают немного по-разному. И, если планируется использовать формы, то лучше сразу создавать WinForms приложение, а не консольное. Теперь по существу...
1. У функции Main нужно добавить атрибут STAThread.
2. В конец функции Main нужно добавить строку Application.Run();.

Это позволит приложению не закрываться после прохождения всего кода функции Main и уберет зависание форм.
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
27.02.2019, 15:38  [ТС]
asn31337, не получается написать то, что Вы сказала, можно подробнее ?
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
27.02.2019, 15:47
Цитата Сообщение от artur31154 Посмотреть сообщение
можно подробнее
C#
1
2
3
4
5
6
7
8
        [STAThread] 
        static void Main(string[] args)
        {
            //Тут пишем весь код - создаем и открываем формы, запускаем потоки и т.д. и т.п.
 
            Application.Run(); // Это должно быть последней строкой. 
                               //Т.к. дальнейший код выполнится только после завершения приложения
        }
Добавлено через 3 минуты
PS. Еще было бы неплохо добавить код выхода из приложения при закрытии всех форм. А то после закрытия консоль будет продолжать висеть... Но это уже отдельная история)))
0
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
27.02.2019, 16:36  [ТС]
asn31337, хорошо, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2019, 16:36
Помогаю со студенческими работами здесь

База данных! Ничего не могу сделать!
В режиме формы не работают некоторые кнопки, в частности меня интересуют 2 кнопки - &quot;Ввод и корректировка КУН&quot; и...

Форматнул все, ничего не могу сделать
на ноутбуке установил новую винду потом решил снести вторую отформатировал случайно все теперь не могу загрузиться и заново винда не...

Не могу запустить файл и вообще с ним ничего сделать
Итак, не могу запустить не могу разархивировать фаил (именно с этого компьютера, на другом работает) Пишет фаил поврежден или имеет...

Поймал вирусную хрень от GetSearch и не могу ничего сделать(
Видел много подобных тем но создал новую как сказано)

Не могу ничего сделать в HDD: создать или удалить файл/папку
Приветствую. Проблема следующего плана. Купил внешний HDD Sata, подключил форматнул создал разделы ( как именно не помню ) ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru