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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые знатоки!)
Прошу помощи в вопросе программирования на 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2013, 20:02
Ответы с готовыми решениями:

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

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

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

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

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

C#
1
2
3
4
        private void Form2_Shown(object sender, EventArgs e)
        {
               // Команда в основную форму на долгие вычисления.
        }
Вместо Form2_Shown может быть другое событие,.
0
228 / 95 / 27
Регистрация: 16.04.2013
Сообщений: 315
Записей в блоге: 2
17.07.2013, 23:30 3
вот тебе класец, если хоть чуть-чуть мозг работает, то допилишь его для своих нужд.
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  [ТС] 4
я что-то с классами никогда не работал, посему не умею может Вы могли бы подсказать что можно почитать по классам?
0
228 / 95 / 27
Регистрация: 16.04.2013
Сообщений: 315
Записей в блоге: 2
18.07.2013, 18:02 5
Цитата Сообщение от Koskapan Посмотреть сообщение
с классами никогда не работал,
ну а каких сплеш формах может идти речь и вообще о gui? Бери книгу по основам и вперед. Троелсена например. В консольке научись писать вначале.
0
0 / 0 / 1
Регистрация: 04.12.2012
Сообщений: 21
19.07.2013, 10:06  [ТС] 6
не, ну консолька - это уже пройдено, да и в ГУИшных средах я работал раньше (Делфи, ВБ), вот только по учебе не приходилось прибегать к классам и многопоточности, хотя гуишные приложения уже давно осваиваю) Рихтер Дж. CLR via C# нормальная мануалка для моих нужд?
0
19.07.2013, 10:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2013, 10:06
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru