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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнять действие пока нажата кнопка 
:(
    Опции темы
Bestrev
Дата 13.6.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

void  кнопка1_Click(object sender, EventArgs e)
вайл(пока нажата кнопка1)
{
действие
}
PM MAIL WWW   Вверх
Экскалупатор
Дата 14.6.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 2
Всего: 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. Думаю можно как то и по другому сделать, но пока не придумал как, да и не факт что будет проще, хотя...

Это сообщение отредактировал(а) Экскалупатор - 14.6.2009, 00:32
PM MAIL ICQ   Вверх
DVariuS
Дата 15.6.2009, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

        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);


Это сообщение отредактировал(а) DVariuS - 15.6.2009, 08:11
PM MAIL   Вверх
Экскалупатор
Дата 15.6.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



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


Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  test.rar 5,37 Kb
PM MAIL ICQ   Вверх
DVariuS
Дата 15.6.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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

Это сообщение отредактировал(а) DVariuS - 15.6.2009, 10:22
PM MAIL   Вверх
Экскалупатор
Дата 15.6.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



DVariuS, ыы-ы, вы будете смеяться но она ничего не выдает, она просто работает...

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  test.rar 0,00 Kb
PM MAIL ICQ   Вверх
DVariuS
Дата 15.6.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

CheckForIllegalCrossThreadCalls = false;

или отключена данная проверка каким-либо другим путем. Однако это не безопасно и Microsoft настоятельно рекомендует использовать показанный мной подход.
PM MAIL   Вверх
Экскалупатор
Дата 15.6.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



DVariuS, меня больше интересует как можно добиться того же эффекта способом попроще, если конечно можно вообще. ну или как принято реализовывать подобные вещи?
PM MAIL ICQ   Вверх
DVariuS
Дата 15.6.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PM MAIL   Вверх
MaestroRED
Дата 23.5.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ThreadStart entryPoint;
Thread ChangeThread;

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

PM MAIL   Вверх
Экскалупатор
Дата 23.5.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



using System.Threading;
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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