Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа "тормозит" при работе 
V
    Опции темы
wonderfulll
Дата 21.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.12.2006
Где: Литва, Вильнюс

Репутация: нет
Всего: 2



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

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

Это сообщение отредактировал(а) wonderfulll - 21.1.2007, 16:29

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  2007_01_21_152607.jpg 18,67 Kb
PM MAIL WWW Skype   Вверх
awers
Дата 21.1.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



Помоему можно решить Потоками.
Код

using System.Threading;

PM MAIL WWW ICQ Skype   Вверх
wonderfulll
Дата 21.1.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.12.2006
Где: Литва, Вильнюс

Репутация: нет
Всего: 2



как раз потоки и использую   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;
            }
        }
    }
}



Это сообщение отредактировал(а) wonderfulll - 21.1.2007, 17:16
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 21.1.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Код
thr._myThread.Join();

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


--------------------
user posted image
PM MAIL WWW   Вверх
marcusmae
Дата 21.1.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



По-моему, тормозит потому что Вы делаете

Код

thr._myThread.Join();


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

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


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
wonderfulll
Дата 24.1.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.12.2006
Где: Литва, Вильнюс

Репутация: нет
Всего: 2



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

спасибо за внимание  smile 
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.