Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544

Обновление окна по таймеру: форма все равно зависает

23.10.2012, 10:29. Показов 7755. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Делаю вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
           
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(() => { this.Refresh();  }));
            }
            else 
            {
                this.Refresh();
            }
            
            timerCount += 1000;
 
            convertTimeLabel.Text = "Конвертируется в течении " + ((float)timerCount / (float)1000).ToString() + " сек";
        }
Но все равно форма висит, пока таймер не остановлен.
Заранее всем спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2012, 10:29
Ответы с готовыми решениями:

thread Все равно программа зависает
Всем привет. Вот встала задача использовать дополнительный поток. Раньше не особо в это вдавался, почитал, сделала как написано, а прога...

Асинхронный вызов метода - форма все равно подвисает
Есть метод, в котором заполняется richtextbox, пытаюсь вызвать его асинхронно с помощью делегатов, но что то не выходит, вот код. Ошибок...

Форма регистрации и логина по видео урокам - все равно не работает
Братва помогите по форме логина , не могу найти ошибку выходить это Fatal error: Can't use function return value in write context in...

18
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 10:54
Событие таймера выполняется в потоке формы. (Если это System.Windows.Forms.Timer)
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 10:56  [ТС]
Это
C#
1
System.Timers.Timer timer = new System.Timers.Timer();
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:02
this.Invoke() - выполняет метод в потоке формы
Какой период у таймера?
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:05  [ТС]
1000. Дело в том, что у меня помимо основного, создано еще 3 потока, но с формой они не работают.
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:08
Кстати, вот это
C#
1
convertTimeLabel.Text
по-моему, тоже нужно в потоке формы выполнять
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:09  [ТС]
я его вообще даже закоментил, разницы нет
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:13
А вручную что то рисуется на форме? Может из за долгой отрисовки всё висит?
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:17  [ТС]
в ручную ничего не рисуется. думаю отрисовыватся долго не должно
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:21
Может уже весь код формы покажете? А то гадать неитересно)
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:29  [ТС]
Весь код очень большой. Покажу кусочки важные
По нажатию на кнопку вызывается метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     public void SaveDocumentsToXML()
        {
            timer.Enabled = true;
            timer.Start();
........
             // Проходим по списку полученных объектов
            Thread[] threads = new Thread[thCount];
            for (int i = 0; i < thCount; i++)
            {
                threads[i] = new Thread(new ParameterizedThreadStart(WorkDocThread));
                threads[i].Start(i);
            }   
......
 
 timer.Stop();
}
в методе WorkDocThread идет дозапись строк в переменную типа string посредством lock()

Объявление таймера сделано глобально
C#
1
System.Timers.Timer timer = new System.Timers.Timer();

Параметры таймера
C#
1
2
3
4
5
6
7
8
public Converter()
        {
            InitializeComponent();
........
 
            timer.Interval = 1000;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        }
И собственно timer_Elapsed
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            timerCount += 1000; 
            if (InvokeRequired)
            {
                Invoke(new Action(() => { 
                    convertTimeLabel.Text = "Конвертируется в течении " + ((float)timerCount / (float)3000).ToString() + " сек"; 
                   Refresh(); }));
            }
            else
            {
                convertTimeLabel.Text = "Конвертируется в течении " + ((float)timerCount / (float)3000).ToString() + " сек";
                Refresh();
            }
            
        }
Больше с формой работы нет нигде. Единственно в потоках идет работа с БД и созранение файлов, может это вешает форму?
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:36
1. Давайте попробуем закомментировать Refresh(), думается мне, он совсем не нужен....
2. Покажите кусочек кода, где идет дозапись строк, с lock()
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:41  [ТС]
Проверил сейчас. за все время this.InvokeRequired никогда не блы равен false

SaveAttach сохраняет файл на диск и возврашает строку с именем этого файла
C#
1
2
3
4
5
6
 docStrThread += SaveAttach(doc);
 
                                lock (docStr)
                                {
                                    docStr += docStrThread;
                                }
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:48
"Форма виснит"
не реагирует на нажатие кнопок и на действия с другими элементами или метка convertTimeLabel не обновляется?
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12:04  [ТС]
Цитата Сообщение от ras254 Посмотреть сообщение
"Форма виснит"
не реагирует на нажатие кнопок и на действия с другими элементами или метка convertTimeLabel не обновляется?
Все выше перечисленное, и плюс если скажем ее перекрывает другое окно, то при его скрытии она не перерисовывается.

Вообщем главная цель, что бы форма обновлялась(перерисовывалась).
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 12:06
Вот эту функцию можно полностью?
C#
1
 public void SaveDocumentsToXML()
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12: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
      public void SaveDocumentsToXML()
        {
            timer.Enabled = true;
            timer.Start();
 
            isFist = firstThreadCB.Checked;
            isError = errorCB.Checked;
 
            string flowsXml = "";
            string proccessXML = "";
            //List<DocumentFlow> dfList = new List<DocumentFlow>();
 
            //Если это главный поток
            if (firstThreadCB.Checked)
            {
                //Обрабатываем потоки
                int flowCount = 0;
                string flowsStr = GetFlowsToXML(ref flowCount, ref dfList);
                flowsXml = string.Format(Constants.flowsXML, flowCount.ToString(), flowsStr);
 
                //Обрабатываем маршруты
                proccessXML = GetProccessToXML();
            }
            else
            {
 
                foreach (CheckBox cb in flowCB)
                {
                    if (cb.Checked)
                    {
                        foreach (DocumentFlow df in connection[0].Flows)
                        {
                            if (cb.Text == df.Name)
                            {
                                dfList.Add(df);
                            }
                        }
                    }
                }
            }
 
            //Обрабатываем документы
            lock (docXML)
            {
                docXML = "<Documents>\n";
            }
 
            lock (docCount)
            {
                docCount = "0";
            }
 
            // Проходим по списку полученных объектов
            Thread[] threads = new Thread[thCount];
            for (int i = 0; i < thCount; i++)
            {
                threads[i] = new Thread(new ParameterizedThreadStart(WorkDocThread));
                threads[i].Start(i);
            }     
 
                     //Ждем пока все потоки завершатся
            bool endWork = false;
            while (!endWork)
            {
                endWork = true;
                for (int k = 0; k < thCount; k++)
                {
                    if (threads[k].ThreadState != ThreadState.Stopped)
                    {
                        endWork = false;
                        break;
                    }
                    else
                    {
                        ThreadState ts = threads[k].ThreadState;
                    }
                }
            }
 
            lock (docStr)
            {
                lock (docXML)
                {
                    docXML += "<Count>" + docCount.ToString() + "</Count>\n" + docStr + "</Documents>\n";
                }
            }
 
            //Сохраняем в файл
            string fileName = "C:\\DownloadFiles\\Documents\\Docs.xml";
            if (!firstThreadCB.Checked)
            {
                fileName = "C:\\DownloadFiles\\Documents\\" + XMLFILEUUID.generateUUID() + ".xml";
            }
            using (StreamWriter sw = new StreamWriter(fileName, false))
            {
                sw.Write(flowsXml + proccessXML + docXML);
            }
 
            timer.Stop();
            lock (log)
            {
              logTextBox.Text =  log;
            }
           
 
        }
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 12:36
Вот причина зависания
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 //Ждем пока все потоки завершатся
            bool endWork = false;
            while (!endWork)
            {
                endWork = true;
                for (int k = 0; k < thCount; k++)
                {
                    if (threads[k].ThreadState != ThreadState.Stopped)
                    {
                        endWork = false;
                        break;
                    }
                    else
                    {
                        ThreadState ts = threads[k].ThreadState;
                    }
                }
            }
В главном потоке, постоянно, не обрабатывая другие события, ожидаем завершения работы созданных потоков....
1
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12:37  [ТС]
Спасибо! Точно блин, я хотел на события переделать и забыл!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.10.2012, 12:37
Помогаю со студенческими работами здесь

Форма если не проходит проверку, все равно отправляет запрос
Всем привет! Помогите подправить код. При клике на кнопку должна проходить валидация и если валидация не проходит, ничего не...

Если форма вдруг закрылась то поток все равно долбится к ликвидированному объекту
readThreed = new Thread(new ThreadStart(RunClient)); readThreed.Start(); } public void RunClient() ...

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

не работает в ворде веб компонент,и скачав обновление ow 11 не работает все равно
проблема с веб элементами и обновлениями на них))

Антивирус Касперского 6.0 проходит обновление через интернет и всё равно пишет что "Безопасность компьютера под угрозой Критическая"?
Антивирус Касперского 6.0 пишет &quot;База сильно устарела&quot; выполняю обновление через интернет и всё равно пишет что &quot;Безопасность...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru