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

Активный загрузочный экран во время выполнения длительных вычислений C#

17.07.2013, 20:02. Показов 3164. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые знатоки!)
Прошу помощи в вопросе программирования на C# в Visual Studio 2010.
Есть функции:


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
void f1(string param1, string param2)
{
    StartLoad();
    //долгие вычисления
    StopLoad();
}
 
        void StartLoad()
        {
                foreach (Control ct in LoadingPanel.Controls)
                {
                    ct.BringToFront();
                    ct.Visible = true;
                }
                LoadingPanel.BringToFront();
                LoadingPanel.Visible = true;
        }
 
        void StopLoad()
        {
            
                label4.Text = "Щёлкните левой кнопкой мыши чтобы продолжить";
                
        }
в общем панель загрузки не прорисовывается и лейбл на ней не отображается пока не закончатся длинные вычисления. Мне бы хотелось сделать так, чтобы вычисления происходили, а основную форму застлила панель загрузки с каким-нибудь контентом (картинки, текст). После завершения вычислений лейбл пишет "Щёлкните левой кнопкой мыши чтобы продолжить", мы щёлкаем по панели и она пропадает, показывая главную форму

Ответы на 7 самых частых вопросов по WinForms уже прочитал
http://blog.stephencleary.com/... tasks.html тоже прочитал, пробовал, не получалось - не знаю куда впихнуть BackgroundWorker

прошу не пинать, приму все советы и напутствия)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2013, 20:02
Ответы с готовыми решениями:

Создать видимость выполнения длительных вычислений
Здравствуйте. Нужна программа, которая будет производить какие-либо вычисления минимум 5 секунд. Пытался с помощью цикла делать...

Не происходит перерисовка окна во время длительных вычислений
При написание программы с использованиям Windows Forms возникла следующая проблема: окно программы вовремя выполнения расчета не...

Цикл: Как избавится от зависаний интерфейса во время длительных вычислений с использованием таймера...
Здравствуйте. Столкнулся с проблемой. Wpf приложение получает некоторые данные из интернета, которые используются для вычисления в довольно...

5
47 / 18 / 4
Регистрация: 17.04.2013
Сообщений: 87
17.07.2013, 22:12
Если я всё правильно понял то у Вас есть проект состоящий из нескольких форм.
Одна основная и пусть одна небольшая с каким то изображением которое должно отвлекать телезрителя пока идут долгие вычисления.
Я в таких случаях подавал команду на очень долгие вычисления из второй формы в основную, как-то так:

C#
1
2
3
4
        private void Form2_Shown(object sender, EventArgs e)
        {
               // Команда в основную форму на долгие вычисления.
        }
Вместо Form2_Shown может быть другое событие,.
0
 Аватар для dev-a1056
228 / 95 / 27
Регистрация: 16.04.2013
Сообщений: 315
Записей в блоге: 2
17.07.2013, 23:30
вот тебе класец, если хоть чуть-чуть мозг работает, то допилишь его для своих нужд.
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
public class BackgroundFunctionRunner : IDisposable
    {
        private const int TIMEOUT_SEC_MINIMIUM_FORM_SHOW = 5;
 
        private readonly bool _runAsync;
        private readonly Action _action;
        private readonly Form _splashForm;
        private readonly DateTime _showUpTo;
        private readonly ManualResetEvent _evtWindowShown = new ManualResetEvent(false);
        private bool _needToCloseSplashForm;
 
        private BackgroundFunctionRunner(bool runAsync, Action function, Form splashForm, int minShow)
        {
            _runAsync = runAsync;
            _action = function;
            _splashForm = splashForm;
            _needToCloseSplashForm = false;
 
            _splashForm.Shown += SplashFormShown;
            _splashForm.FormClosing += SplashFormFormClosing;
 
            var thread = new Thread(ThreadProc);
            thread.Start();
 
            _showUpTo = DateTime.UtcNow.AddSeconds(minShow);
            _splashForm.Cursor = Cursors.WaitCursor;
            _splashForm.ShowDialog();
 
            thread.Join(TimeSpan.FromSeconds(20));
        }
 
        private void SplashFormFormClosing(object sender, FormClosingEventArgs e)
        {
            if (!_needToCloseSplashForm)
                e.Cancel = true;
        }
 
        private void SplashFormShown(object sender, EventArgs e)
        {
            _evtWindowShown.Set();
        }
 
        #region IDisposable Members
 
        void IDisposable.Dispose()
        {
            _splashForm.Shown -= SplashFormShown;
            _evtWindowShown.Close();
        }
 
        #endregion
 
        public static void Run(Action action, string message, int minShowTime)
        {
            using (var waitingForm = new WaitingForm())
            {
                waitingForm.Message = message;
                Run(action, waitingForm, minShowTime);
            }
        }
 
        public static void Run(Action action, string message)
        {
            using (var waitingForm = new WaitingForm())
            {
                waitingForm.Message = message;
                Run(action, waitingForm);
            }
        }
 
        public static void Run(Action action, Form splashForm)
        {
            Run(action, splashForm, TIMEOUT_SEC_MINIMIUM_FORM_SHOW);
        }
 
        public static void Run(Action action, Form splashForm, int minShowTime)
        {
            using (var runner = new BackgroundFunctionRunner(false, action, splashForm, minShowTime))
            {
                if (runner.Exception != null)
                    throw runner.Exception;
            }
        }
 
        public static void RunAsync(Action action, Form splashForm)
        {
            using (var runner = new BackgroundFunctionRunner(true, action, splashForm, 0))
            {
                if (runner.Exception != null)
                    throw runner.Exception;
            }
        }
 
        public static void RunNoWaitTimeout(Action action, string message)
        {
            using (var waitingForm = new WaitingForm())
            {
                waitingForm.Message = message;
                using (var runner = new BackgroundFunctionRunner(false, action, waitingForm, 0))
                {
                    if (runner.Exception != null)
                        throw runner.Exception;
                }
            }
        }
 
        public Exception Exception { get; private set; }
 
        private void ThreadProc()
        {
            try
            {
                if (!_evtWindowShown.WaitOne(TimeSpan.FromSeconds(20), false))
                    throw new Exception("Could not show window. Timeout: [20 sec]");
                _action();
                TimeSpan waitPeriod = _showUpTo - DateTime.UtcNow;
                if (waitPeriod > TimeSpan.Zero)
                    Thread.Sleep(waitPeriod);
            }
            catch (Exception exc)
            {
                Exception = exc;
                //Log.Exception(exc);
            }
            finally
            {
                if (!_runAsync)
                    SafeInvokeClose();
            }
        }
 
        private void CloseSplashForm()
        {
            _needToCloseSplashForm = true;
            _splashForm.Close();
        }
 
        private void SafeInvokeClose()
        {
            try
            {
                if (_splashForm.InvokeRequired)
                {
                    _splashForm.Invoke(new MethodInvoker(SafeInvokeClose));
                }
                else
                {
                    CloseSplashForm();
                }
            }
            catch (Exception exc)
            {
                //Log.Exception(exc);
            }
        }
    }
вот SplashForm для примера:
будет ругаться на строку Properties.Resources.loading, т.к. у меня гифка с крутящемеся лепистками в ресурсы добавлена, т.е. тебе нужно добавить что-то свое.
Дизайнер:
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
 partial class WaitingForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(WaitingForm));
            this._img = new System.Windows.Forms.PictureBox();
            this._lblMsg = new System.Windows.Forms.Label();
            ((System.ComponentModel.ISupportInitialize)(this._img)).BeginInit();
            this.SuspendLayout();
            // 
            // _img
            // 
            this._img.Image = Properties.Resources.loading; //вот тут в ресурсы добавь картинку
            this._img.Location = new System.Drawing.Point(12, 28);
            this._img.Name = "_img";
            this._img.Size = new System.Drawing.Size(16, 16);
            this._img.TabIndex = 0;
            this._img.TabStop = false;
            // 
            // _lblMsg
            // 
            this._lblMsg.AutoSize = true;
            this._lblMsg.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F);
            this._lblMsg.Location = new System.Drawing.Point(34, 29);
            this._lblMsg.Name = "_lblMsg";
            this._lblMsg.Size = new System.Drawing.Size(61, 13);
            this._lblMsg.TabIndex = 1;
            this._lblMsg.Text = "Please wait";
            // 
            // WaitingForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(336, 72);
            this.ControlBox = false;
            this.Controls.Add(this._lblMsg);
            this.Controls.Add(this._img);
            this.Cursor = System.Windows.Forms.Cursors.Arrow;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "WaitingForm";
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Please wait";
            ((System.ComponentModel.ISupportInitialize)(this._img)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.PictureBox _img;
        private System.Windows.Forms.Label _lblMsg;
    }
юзер-код:
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
public partial class WaitingForm : Form
    {
        public WaitingForm()
        {
            InitializeComponent();
        }
 
        public string Message
        {
            get { return _lblMsg.Text; }
            set
            {
                if (value != Message)
                {
                    _lblMsg.Text = value;
                    _lblMsg.Top = (ClientRectangle.Height - _lblMsg.Height)/2;
 
                    int centeredLeft = (ClientRectangle.Width - _lblMsg.Width)/2;
                    if (centeredLeft >= _lblMsg.Left)
                        _lblMsg.Left = centeredLeft;
 
                    _img.Top = ((ClientRectangle.Height - _img.Height)/2);
                }
            }
        }
    }
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
18.07.2013, 15:32  [ТС]
я что-то с классами никогда не работал, посему не умею может Вы могли бы подсказать что можно почитать по классам?
0
 Аватар для dev-a1056
228 / 95 / 27
Регистрация: 16.04.2013
Сообщений: 315
Записей в блоге: 2
18.07.2013, 18:02
Цитата Сообщение от Koskapan Посмотреть сообщение
с классами никогда не работал,
ну а каких сплеш формах может идти речь и вообще о gui? Бери книгу по основам и вперед. Троелсена например. В консольке научись писать вначале.
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
19.07.2013, 10:06  [ТС]
не, ну консолька - это уже пройдено, да и в ГУИшных средах я работал раньше (Делфи, ВБ), вот только по учебе не приходилось прибегать к классам и многопоточности, хотя гуишные приложения уже давно осваиваю) Рихтер Дж. CLR via C# нормальная мануалка для моих нужд?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2013, 10:06
Помогаю со студенческими работами здесь

Узнать время выполнения программой длительных операций с данными
Здравствуйте, есть программа которая работает с большими объемами данных. Использую vs 2010 Professional. Как можно узнать время выполнения...

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

Application.ProcessMessages не работает - кнопка недоступна во время выполнения вычислений программой
Всем привет! Суть программы две кнопки СТАРТ и СТОП. СТАРТ - запускает некий процесс, в котором есть цикл выполняющий большое количество...

Выполнение длительных вычислений и операций в отдельном потоке
Добрый вечер. Возникла проблема с вычислениями. Из базы данных (файл) читаются числа и выполняются с ними операции.....

Установить Активный (загрузочный) жёсткий диск
Купил SSD. Создал на нём раздел. Из под существующей винды поставил на него (SSD) точно такую же сборку, как имеющаяся. Теперь хочу...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru