Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 07:43   #11
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

теперь привожу свой код и спрашиваю почему он тормозит так будто не создаёт новый поток?

using System;
using System.Threading;

public partial class Form1 : Form
{


public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
string adress = "";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
adress = openFileDialog1.FileName;
progressBar1.Enabled = true;
progressBar1.Style = ProgressBarStyle.Marquee;
Work workerObject = new Work();
Thread workerThread = new Thread(workerObject.DoWork);
workerThread.Start(adress);
richTextBox1.Text = "Thread started";
while (!workerThread.IsAlive)
Thread.Sleep(1);

}
}
}

public class Work
{
bool _shouldStop;

public void DoWork(object adress)
{
//////всякие читающие команды которые занимают вагон времени
}
}
}
Образец для всего этого безобразия по вашему совету нашёл в инете.

Последний раз редактировалось tigrend; 13.04.2010 в 07:44. Причина: скобочку потерял
tigrend вне форума Ответить с цитированием
Старый 13.04.2010, 08:22   #12
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

;
Цитата:
while (!workerThread.IsAlive)
Thread.Sleep(1)
из- за этого У вас основной поток в явном виде ждет пока завершится выполнение всяких читающих команд, практически тоже самое что и выполнять их в основном потоке. Кстати, основной поток должен еще что-то делать?
Teksa вне форума Ответить с цитированием
Старый 13.04.2010, 10:31   #13
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

Нет. Ничего больше кроме ожидания счастливого конца.
Многопоточность нужна только чтобы форма не висла на период чтения.
И как же тогда сделать чтобы форма не висела, а была таскабельна за загривок и ждала ожидания вторичного потока?
UPD ой. всем спасибо. будем ожидать конца не так явно. например по таймеру раз в полсекунды.

Последний раз редактировалось tigrend; 13.04.2010 в 10:43. Причина: выполнено
tigrend вне форума Ответить с цитированием
Старый 14.04.2010, 01:18   #14
Arnezami
Форумчанин
 
Регистрация: 04.10.2009
Сообщений: 147
По умолчанию

Чтобы кнопочка не зависала, или основной поток - выполняй метод через отдельный поток! Просто я не знаю сути задачи... Чтобы обезопасить повторые нажатия - используй локер или просто блокируй кнопку, пока не завершиться поток

Код:
public partial class FileReader : Form
    {
        public FileReader()
        {
            InitializeComponent();
        }    

       private void button1_Click(object sender, EventArgs e)
        {
            if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
                !string.IsNullOrEmpty(openFileDialog1.FileName))
            {
                new Thread(new Work(openFileDialog1.FileName).ReadSettingsFile) { IsBackground = true, Name = "FileReader" }.Start();
            }
        }
    }

    public class Work
    {
        private object locker = new object();
        private string _address { set; get; }
        
        public Work(string address)
        {
            _address = address; //Инициализируем приватную переменную
        }

        public void ReadSettingsFile()
        {
            lock (locker)
            {
                ///Код чтения файла (Локер не даёт другим потокам обратиться к данному куску кода, пока здесь 
                /// работает другой поток, тоесть, заходя - поток закрывает за собой дверь, и открывает когда выходит)
                ///_address - путь к файлу
            }
        }
    }
Ув. Форумчане! Если мои советы были Вам полезны, не забывайте благодарить в виде повышение рейтинга!!!
http://vkontakte.ru/id6715558

Последний раз редактировалось Arnezami; 14.04.2010 в 01:39.
Arnezami вне форума Ответить с цитированием
Старый 14.04.2010, 21:04   #15
Teksa
Пользователь
 
Регистрация: 24.08.2007
Сообщений: 88
По умолчанию

что значит "будем ожидать конца не так явно" идея многопоточности - сплавить длинные операции на задний план, не дожидаясь их окончания. Чтобы узнать не завершился ли поток - можно спросить IsAlive, например делать это при нажатии на кнопку (если я правильно понял цель ожидания - предотвратить вторичный запуск.)
Teksa вне форума Ответить с цитированием
Старый 19.04.2010, 08:08   #16
tigrend
Пользователь
 
Регистрация: 10.04.2010
Сообщений: 31
По умолчанию

Цель ожидания прозаична. Нам кроме этого чтения, на самом деле, до его окончания ничего не нужно, и я бы делал это в основном потоке, да форма зависает.
Да, проверяю я именно IsAlive(), но вызов второго потока не даёт на деле ничего страшного. В итоге всё равно получается то что надо.
Главное это считать. И чтобы пользователю не было скучно он может таскать форму за загривок. И можно какую нибудь стороннюю анимацию сделать. Или мини-игру. Не решил ещё.
tigrend вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность Neymexa Помощь студентам 3 13.04.2010 11:43
Многопоточность JakSon Общие вопросы Delphi 10 27.12.2009 02:19
Многопоточность на билдере Golovastik Помощь студентам 0 03.10.2009 21:59
Многопоточность. newmister Общие вопросы Delphi 9 24.07.2009 12:54
Многопоточность PUH Помощь студентам 3 06.06.2009 13:54