Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/95: Рейтинг темы: голосов - 95, средняя оценка - 4.94
194 / 193 / 17
Регистрация: 07.11.2010
Сообщений: 477

"Программа не отвечает" (сложные расчеты)

20.11.2010, 17:16. Показов 18695. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приложение выполняет сложные длительные расчеты. Кликнул - ждешь 2-4 минуты.
Я прилепил внизу окна программы статусную строку и прогрессбар, чтоб было видно что она не зависла, а работает.
Все чудно до тех пор пока во время работы не кликнешь в любом месте окна. Сразу после клика курсор из стрелки превращается в песочные часы и прогрессбар+статусная строка перестают обновляться - типо программа подвисает. По окончанию расчета появляется окошко с сообщением, что расчет окончен и все становится в порядке.

Вопрос - можно ли как-нибудь избавиться от такого подвисания программы, чтобы она при любых кликах во время расчета нормально отображала в статусе текущее состояние и прогрессбар работал?

А на будущее - еще как-нибудь бы чтоб этот расчет можно было прервать... Я и кнопку Прервать на форму поставлю, но толку от неё если все подвисает после клика?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2010, 17:16
Ответы с готовыми решениями:

Сложные периодические расчеты
Какая та задача из теста для программистов 1с. Может есть где решенная? Долг висит, сдать надо, а с этими расчетами разбираться тяжко. ...

Правильно ли программа делает расчеты?
Условие: Дани векторы X и Y с n координатами и кваратные матрицы А и В, размерности n X n. Найти вектор Z=A*Y+A*Y Почему я создал...

Программа делает неправильные расчеты
Программа вроде работает, но делает неправильные расчеты. program kursova22; uses crt; type arr= arrayof real; ...

28
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
21.01.2015, 18:27
Студворк — интернет-сервис помощи студентам
Эти строки вообще ни о чём не говорят.

Добавлено через 34 секунды
Ты думаешь тут кто-то знает, что у тебя там дальше в методе происходит? Или знает все типы передаваемых параметров?
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
21.01.2015, 18:33
Цитата Сообщение от Casper-SC Посмотреть сообщение
Показать код.
У меня тоже форма виснем намертво, код выше от Leax,
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.01.2015, 18:38
Цитата Сообщение от Leax Посмотреть сообщение
А без потоков никак?
Ни как. Пока запущенная в потоке функция не вернёт управление, он не может делать больше ничего, в том числе принимать сообщения. Принимать сообщения может только первичный поток, делать всё остальное можно тоже только в каких то потоках. Если не во вторичных, значит в первичном и пока он занят, сообщения принимать некуда. А без сообщений кнопки не работают.
0
14 / 4 / 1
Регистрация: 08.11.2012
Сообщений: 189
Записей в блоге: 1
21.01.2015, 18:41
Цитата Сообщение от Casper-SC Посмотреть сообщение
Эти строки вообще ни о чём не говорят.
Добавлено через 34 секунды
Ты думаешь тут кто-то знает, что у тебя там дальше в методе происходит? Или знает все типы передаваемых параметров?
Так вопрос не в том, что ошибка вылазит. Все выполняется и работает. Только не достигается эффекта работы бекграунда. На время выполнения программа Не отвечает, и все.

Этот метод update_dataset_background(...) работает нормально. Там нечего смотреть.
Мне кажется, что аргументы этого метода не правильно передабтся в Бекграунд.
Но если уж надо посмотреть код, то пожалуйста:
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
public void update_dataset_background(CheckBox checkBox_same, BackgroundWorker worker, DoWorkEventArgs e, ListBox listBox_primary_key, ListBox listBox_primary_key_excel, ListBox listBox_fields, ListBox listBox_fields_excel, DataGridView dataGridView_excel_file, DataGridView dataGridView_currenttable, uint updatedRows, Color newPriceColor)
        {
            try
            {
                if (dataGridView_currenttable.DataMember == "TableCurrent")
                {
                    if (checkBox_same.Checked)
                    {
                        update_dataset_same(worker, listBox_primary_key, listBox_primary_key_excel, listBox_fields, listBox_fields_excel, dataGridView_excel_file, dataGridView_currenttable, updatedRows, newPriceColor);
                    }
                    else
                    {
                        update_dataset(worker, listBox_primary_key, listBox_primary_key_excel, listBox_fields, listBox_fields_excel, dataGridView_excel_file, dataGridView_currenttable, updatedRows, newPriceColor);
                    }
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
private void update_dataset(BackgroundWorker worker, ListBox listBox_primary_key, ListBox listBox_primary_key_excel, ListBox listBox_fields, ListBox listBox_fields_excel, DataGridView dataGridView_excel_file, DataGridView dataGridView_currenttable, uint updatedRows, Color newPriceColor)
        {
            try
            {
                updatedRows = 0;
                if (listBox_primary_key.SelectedItems.Count > 0 && listBox_primary_key_excel.SelectedItems.Count > 0)
                {
                    if (listBox_primary_key.SelectedItems.Count == listBox_primary_key_excel.SelectedItems.Count)
                    {
                        if (listBox_fields.SelectedItems.Count > 0 && listBox_fields_excel.SelectedItems.Count > 0)
                        {
                            if (listBox_fields.SelectedItems.Count == listBox_fields_excel.SelectedItems.Count)
                            {
                                // ProgressBar
                                //this.startProgressBar(this.dataGridView_excel_file.RowCount);
                                for (int i = 0; i < dataGridView_excel_file.RowCount; i++)
                                {
                                    // Get primary keys
                                    List<string> excel_keys = new List<string>();
                                    for (int ii = 0; ii < listBox_primary_key_excel.SelectedItems.Count; ii++)
                                    {
                                        if (string.IsNullOrEmpty(dataGridView_excel_file.Rows[i].Cells[listBox_primary_key_excel.SelectedItems[ii].ToString()].Value.ToString().Trim()))
                                        {
                                            excel_keys.Clear();
                                            continue;
                                        }
                                        excel_keys.Add(dataGridView_excel_file.Rows[i].Cells[listBox_primary_key_excel.SelectedItems[ii].ToString()].Value.ToString().Trim());
                                        //Application.DoEvents();
                                    }
                                    if (excel_keys.Count == 0)
                                    {
                                        continue;
                                    }
                                    for (int j = 0; j < dataGridView_currenttable.SelectedRows.Count; j++)
                                    {
                                        if (dataGridView_currenttable.SelectedRows[j].DefaultCellStyle.BackColor != newPriceColor)
                                        {
                                            // Get primary keys
                                            List<string> table_keys = new List<string>();
                                            for (int jj = 0; jj < listBox_primary_key.SelectedItems.Count; jj++)
                                            {
                                                if (string.IsNullOrEmpty(dataGridView_currenttable.SelectedRows[j].Cells[listBox_primary_key.SelectedItems[jj].ToString()].Value.ToString().Trim()))
                                                {
                                                    table_keys.Clear();
                                                    continue;
                                                }
                                                table_keys.Add(dataGridView_currenttable.SelectedRows[j].Cells[listBox_primary_key.SelectedItems[jj].ToString()].Value.ToString().Trim());
                                                //Application.DoEvents();
                                            }
                                            if (table_keys.Count == 0)
                                            {
                                                continue;
                                            }
 
                                            // Exists
                                            if (excel_keys.Intersect(table_keys).Count<string>() == excel_keys.Count)
                                            {
                                                bool updated = false;
                                                for (int k = 0; k < listBox_fields.SelectedItems.Count; k++)
                                                {
                                                    Type valueType = dataGridView_currenttable.Columns[listBox_fields.SelectedItems[k].ToString()].ValueType;
                                                    object valueFrom = dataGridView_excel_file.Rows[i].Cells[listBox_fields_excel.SelectedItems[k].ToString()].Value;
                                                    if (correctValue(valueType, ref valueFrom))
                                                    {
                                                        dataGridView_currenttable.SelectedRows[j].Cells[listBox_fields.SelectedItems[k].ToString()].Value = valueFrom;
                                                        updated = true;
                                                    }
                                                }
                                                if (updated)
                                                {
                                                    dataGridView_currenttable.SelectedRows[j].DefaultCellStyle.BackColor = newPriceColor;
                                                    updatedRows++;
                                                }
                                                break;
                                            }
                                        }
                                        //Application.DoEvents();
                                    }
                                    //this.progressBar.PerformStep();
                                    //int percentComplete = (int)(i / (float)(this.dataGridView_excel_file.RowCount * 100.0));
                                    worker.ReportProgress(i);
                                }
                            }
                        }
                    }
                }
                //this.progressBar.Visible = false;
                dataGridView_currenttable.Select();
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
21.01.2015, 19:00
Так ты с контролами работаешь в другом потоке? Так понятно почему всё виснет. Получи данные из контролов, с ними что-то сделай, выведи результат. Вообще нигде так не делай, как ты делаешь сейчас, это жесть вообще.

Добавлено через 5 минут
Хотя я не вникал, что конкретно там у тебя происходит, может в этом случае по другому и не сделать. Не знаю, не охота додумывать, что там для чего.
0
14 / 4 / 1
Регистрация: 08.11.2012
Сообщений: 189
Записей в блоге: 1
21.01.2015, 19:35
Цитата Сообщение от Casper-SC Посмотреть сообщение
Так ты с контролами работаешь в другом потоке? Так понятно почему всё виснет. Получи данные из контролов, с ними что-то сделай, выведи результат. Вообще нигде так не делай, как ты делаешь сейчас, это жесть вообще.
Добавлено через 5 минут
Хотя я не вникал, что конкретно там у тебя происходит, может в этом случае по другому и не сделать. Не знаю, не охота додумывать, что там для чего.
В том то и дело, что по-другому и не сделаешь.
У меня программа была однопоточная. Но когда обрабатывается большой Эксель файл, в цикл заводится много данных, плюс они взаимодействуют с, действительно, многими контролами, да еще сравнение с лругой такой большой таблицей. Поэтому, при выполнении цикла, программа виснет на время выполнения цикла.
В итоге все делает нормально. Но эффект зависания для непосвященного пользователя создает впечатление, что прога зависла навсегда, хотя это не так.
Поэтому решил вывести в другой поток этот цикл, чтобы основной поток программы не вис. Но тут надо передавать немеренное количество аргументов.
Хотел отделаться легкими изменениями. Но видимо не получится.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.01.2015, 19:37
Цитата Сообщение от Vitukr Посмотреть сообщение
В том то и дело, что по-другому и не сделаешь.
У меня программа была однопоточная. Но когда обрабатывается большой Эксель файл,
Это в его то ограничении на оперативу?
0
14 / 4 / 1
Регистрация: 08.11.2012
Сообщений: 189
Записей в блоге: 1
22.01.2015, 19:16
Если отказываться от второго потока, то возникла мысль.
А как посылать системе сообщение, типа "Я не завис"?
Ведь реально то мне надо устранить текст, который дописывает система в заголовке программы:"Не отвечает".
0
24 / 24 / 5
Регистрация: 04.04.2012
Сообщений: 107
20.09.2018, 11:45
Цитата Сообщение от Vitukr Посмотреть сообщение
А как посылать системе сообщение, типа "Я не завис"?
C#
1
 Application.DoEvents();
А вообще вопрос интересный как Windows определяет "зависон", вроде с консольными я такого не замечал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.09.2018, 11:45

Программа неверно делает расчеты
Доброго времени суток! У меня был код программы которая решала задачку о Ханойских башнях. В центре мира в вершинах равностороннего...

Мощная вычислительная программа. Инженерные расчёты
Здравствуйте. Я студент, инженер-строитель. Владею на среднем уровне программой MathCad. В связи с тем, что необходимо через год на шестом...

сложные зад4чи, парсинг, компиляторы, автоматическое преобразование исходника, сложные Regex
специализируюсь на работе со всякого рода парсингом и автоматическим форматированием/переписыванием. Имею опыт написания и использования...

Не знаю почему не производит расчёты моя программа!!!
Здравствуйте. Очень хочу попросить помощи в определении ошибки. Сейчас пишу программу, которая уже исправно работает в MathCAD. Необходимо...

Программа делает расчеты и выводит результаты на экран
К примеру, пользователю необходимо ввести 5 чисел (каждое число в отдельное окошко), а программа произведет необходимые вычисления,...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru