Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
1

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

23.10.2012, 10:29. Показов 7023. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2012, 10:29
Ответы с готовыми решениями:

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

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

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

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

18
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 10:54 2
Событие таймера выполняется в потоке формы. (Если это System.Windows.Forms.Timer)
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 10:56  [ТС] 3
Это
C#
1
System.Timers.Timer timer = new System.Timers.Timer();
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:02 4
this.Invoke() - выполняет метод в потоке формы
Какой период у таймера?
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:05  [ТС] 5
1000. Дело в том, что у меня помимо основного, создано еще 3 потока, но с формой они не работают.
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:08 6
Кстати, вот это
C#
1
convertTimeLabel.Text
по-моему, тоже нужно в потоке формы выполнять
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:09  [ТС] 7
я его вообще даже закоментил, разницы нет
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:13 8
А вручную что то рисуется на форме? Может из за долгой отрисовки всё висит?
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:17  [ТС] 9
в ручную ничего не рисуется. думаю отрисовыватся долго не должно
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 11:21 10
Может уже весь код формы покажете? А то гадать неитересно)
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:29  [ТС] 11
Весь код очень большой. Покажу кусочки важные
По нажатию на кнопку вызывается метод
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 12
1. Давайте попробуем закомментировать Refresh(), думается мне, он совсем не нужен....
2. Покажите кусочек кода, где идет дозапись строк, с lock()
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 11:41  [ТС] 13
Проверил сейчас. за все время 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 14
"Форма виснит"
не реагирует на нажатие кнопок и на действия с другими элементами или метка convertTimeLabel не обновляется?
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12:04  [ТС] 15
Цитата Сообщение от ras254 Посмотреть сообщение
"Форма виснит"
не реагирует на нажатие кнопок и на действия с другими элементами или метка convertTimeLabel не обновляется?
Все выше перечисленное, и плюс если скажем ее перекрывает другое окно, то при его скрытии она не перерисовывается.

Вообщем главная цель, что бы форма обновлялась(перерисовывалась).
0
73 / 73 / 10
Регистрация: 18.09.2012
Сообщений: 208
23.10.2012, 12:06 16
Вот эту функцию можно полностью?
C#
1
 public void SaveDocumentsToXML()
0
Автор FAQ
Автор FAQ
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12:30  [ТС] 17
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 18
Вот причина зависания
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
1800 / 612 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
23.10.2012, 12:37  [ТС] 19
Спасибо! Точно блин, я хотел на события переделать и забыл!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2012, 12:37
Помогаю со студенческими работами здесь

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

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

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

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

Обновление текста по таймеру
Что нужно: Раз в секунду идёт пересчёт данных внутри приложения и эти обновлённые данные...

Обновление текста по таймеру
Прошу больно ногами не бить, с флешем работают первый день, вернее первые 2 часа. Встала задачка...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru