Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Выполнять действие пока нажата кнопка


Автор: Bestrev 13.6.2009, 22:17
Товарищи, есть определённое действие, которое выполняется пока зажата кнопка на форме. Помогите реализовать программно.

void  кнопка1_Click(object sender, EventArgs e)
вайл(пока нажата кнопка1)
{
действие
}

Автор: Экскалупатор 14.6.2009, 00:24
Предлагаю через потоки сделать:
Код

ThreadStart entryPoint;
        Thread ChangeThread;
private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            entryPoint = new ThreadStart(whileDown);
            ChangeThread = new Thread(entryPoint);
            ChangeThread.Name = "myTread";
            ChangeThread.Start();
        }
        void whileDown()
        {
            for (int i = 0; true; i++)
            {
                label1.Text = i.ToString();
            }
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            ChangeThread.Abort();
        }


привожу кусок кода, предполагает что на форме есть кнопка button1 и лейбл label1 код меняет значения в лейбле пока нажата кнопка. т.е. при событии MouseDown поток запускается при отпускании кнопки поток закрывается. Пример странный но рабочий, думаю для разбора сгодиться. 
p.s. Думаю можно как то и по другому сделать, но пока не придумал как, да и не факт что будет проще, хотя...

Автор: DVariuS 15.6.2009, 08:10
Экскалупатор, твой код работать не будет. Вот исправленный вариант:
Код

        ThreadStart entryPoint;
        Thread ChangeThread;

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            entryPoint = new ThreadStart(whileDown);
            ChangeThread = new Thread(entryPoint);
            ChangeThread.Name = "myTread";
            ChangeThread.Start();
        }

        void whileDown()
        {
            for (int i = 0; true; i++)
            {
                this.Invoke(new ChangeTextDelegate(ChangeTextOnLabel1), i.ToString());
            }
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            ChangeThread.Abort();
        }

        void ChangeTextOnLabel1(string newText)
        {
            label1.Text = newText;
        }

        delegate void ChangeTextDelegate(string newText);

Автор: Экскалупатор 15.6.2009, 10:09
DVariuS, с чего вы взяли что он не будет работать? у меня все работает.
вот пример:

Автор: DVariuS 15.6.2009, 10:22
Экскалупатор, потому что по-умолчанию исполняющая среда .NET выдаст исключение вида:
Цитата

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "label1" не из того потока, в котором он был создан.

А если твой код работает - это следствие определенных настроек компилятора или манипуляций с атрибутами и является скорее исключением, чем правилом. 

Автор: Экскалупатор 15.6.2009, 10:35
DVariuS, ыы-ы, вы будете смеяться но она ничего не выдает, она просто работает...

Автор: DVariuS 15.6.2009, 10:49
Экскалупатор, я же сказал, работоспособность такого подхода - скорее случайность. Он может работать в 99 случаях из 100 при разработке и тестировании и совершенно отказаться работать при демонстрации готового продукта. У тебя просто установлено следующее свойство:
Код

CheckForIllegalCrossThreadCalls = false;

или отключена данная проверка каким-либо другим путем. Однако это не безопасно и Microsoft настоятельно рекомендует использовать показанный мной подход.

Автор: Экскалупатор 15.6.2009, 11:57
DVariuS, меня больше интересует как можно добиться того же эффекта способом попроще, если конечно можно вообще. ну или как принято реализовывать подобные вещи?

Автор: DVariuS 15.6.2009, 12:14
http://msdn.microsoft.com/en-us/library/ms171728.aspx

Автор: MaestroRED 23.5.2010, 10:08
ThreadStart entryPoint;
Thread ChangeThread;

где непосредственно они объявлены?

Автор: Экскалупатор 23.5.2010, 12:06
using System.Threading;

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