Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Программа "тормозит" при работе


Автор: wonderfulll 21.1.2007, 16:29
Имееися программа которая открывает какое-то n-количество .rtf файлов и считает скока всего символол в этих файлах (файл считывается в невидемый RichTextBox и от туда берётся TextLength). Когда программа начинает работать её невозможно не подвинуть не что-либо с ней сделать видно тока добавление текста в TextBox, также пропадает(что-то похожее на прозрачность) кнопка. 
Как можно этого избежать?

в прикреплённом файле скрин программы

Автор: awers 21.1.2007, 16:41
Помоему можно решить Потоками.
Код

using System.Threading;

Автор: wonderfulll 21.1.2007, 17:10
как раз потоки и использую   smile 

вот сорс
Код

        private void button1_Click(object sender, EventArgs e)
        {
            int count_files = 0;
            int count_all_char = 0;

            OpenFileDialog open_files = new OpenFileDialog();
            open_files.Multiselect = true;
            open_files.Filter = "Rich Text Format (*.rtf)|*.rtf";
            open_files.Title = "Type File";

            if (open_files.ShowDialog() == DialogResult.OK)
            {
                foreach (string s in open_files.FileNames) 
                {
                    int count_char;
                    MyThread thr = new MyThread(s);
                    thr._myThread.Join();
                    if (!thr._error)
                    {
                        count_char = thr._text_lenght;
                        textBox1.AppendText(s + " (" + count_char + ")\r\n");
                        count_all_char += count_char;
                        count_files++;
                    }
                }

                
                textBox1.AppendText("Всего файлов: " + count_files +"\r\n");
                textBox1.AppendText("Всего символов: " + count_all_char + "\r\n");
            }
        }


Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.IO;

namespace RtfCharecterCount
{
    class MyThread
    {
        public Thread _myThread;
        public string _file_path;
        public int _text_lenght;
        public bool _error = false;

        public MyThread(string filepath) 
        {
            _text_lenght = 0;
            _myThread = new Thread(new ThreadStart(this.run));
            _file_path = filepath;
            _myThread.Priority = ThreadPriority.Lowest;
            _myThread.Start();            
        }

        void run()
        {
            try {
                RichTextBox _rtb = new RichTextBox();
                _rtb.Visible = false;
                _rtb.LoadFile(_file_path);
                _text_lenght = _rtb.TextLength;
                _rtb.Clear();
            } catch(ArgumentException exp) {
                MessageBox.Show("Файл " + _file_path + " не является .rtf файлом!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                _error = true;
            } catch(IOException exp1) {
                MessageBox.Show("Не удаётся открыть файл " + _file_path + "\nЗакройте все программы использующие этот файл и попытайтесь снова.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                _error = true;
            }
        }
    }
}


Автор: mr.DUDA 21.1.2007, 18:33
Код
thr._myThread.Join();

Вот этой строчкой мы фактически сидим и ждём пока не завершится поток. Что это за многопоточность такая ?  smile 

Автор: marcusmae 21.1.2007, 18:33
По-моему, тормозит потому что Вы делаете

Код

thr._myThread.Join();


что означает, что текущий поток блокирован до тех пор, пока не завершится поток, читающий файл.

Добавлено @ 18:39 
Вы хотите, чтобы в то время, как работают читающие потоки, окно могло обновляться? = Наверно, следующий подход помог бы : создаём читающий поток без всяких Join и делаем событие на его завершение. Обработчик этого события ставим в форме окна - т.е., данные текстбокса будут обновляться только в момент возникновения этого события, а всё остальное время форма может обновляться, перерисовываться и тп.

Автор: wonderfulll 24.1.2007, 18:56
проблему решил делая аналогично по этой статье
http://msdn2.microsoft.com/en-us/library/ms951089.aspx

спасибо за внимание  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)