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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2015, 12:01   #1
Maks3
Пользователь
 
Регистрация: 23.11.2014
Сообщений: 28
По умолчанию Поток по кнопке

Код:
if (e.KeyCode == Keys.W)
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(IPAddress.Parse("192.168.0.15"), 80);
                socket.Send(new byte[] { 16, 18, 17, 18 });//старт
                Thread.Sleep(200);
                socket.Send(new byte[] { 16, 19, 17, 19 });//стоп
                socket.Disconnect(false);
Есть такой кусок кода, при нажатии на W посылаем команду на старт, через промежуток тормозим. Как реализовать, чтобы пока держим W посылалось socket.Send(new byte[] { 16, 18, 17, 18 });, как только отпускаем W, отправилось единажды socket.Send(new byte[] { 16, 19, 17, 19 });
Понимаю, что вроде как надо через while, но как точно не знаю
Maks3 вне форума Ответить с цитированием
Старый 04.02.2015, 12:26   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

KeyDown/KeyUp вместо KeyPress
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.02.2015, 12:35   #3
Maks3
Пользователь
 
Регистрация: 23.11.2014
Сообщений: 28
По умолчанию

подскажите пожалуйста, как использовать
Maks3 вне форума Ответить с цитированием
Старый 04.02.2015, 12:38   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

по KeyDown запускаете в отдельном потоке бесконечный цикл, отправляющий старт-команду
По KeyUp - прерываете работу этого цикла
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.02.2015, 18:52   #5
Maks3
Пользователь
 
Регистрация: 23.11.2014
Сообщений: 28
По умолчанию

Код:
public Form1()
        {
            InitializeComponent();
            this.KeyDown += new KeyEventHandler(Form_KeyDown);
            this.KeyUp += new KeyEventHandler(Form_KeyUp);
        }
 
        private void Form_KeyDown(object sender, KeyEventArgs e)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(IPAddress.Parse("192.168.0.15"), 80);
            if (e.KeyCode == Keys.W)
            {
            socket.Send(new byte[] {16, 18, 17, 18 });//старт
            socket.Disconnect(false);
            }
       }
 
        private void Form_KeyUp(object sender, KeyEventArgs e)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(IPAddress.Parse("192.168.0.15"), 80);
 
            if (e.KeyCode == Keys.W)
            {
                socket.Send(new byte[] { 16, 19, 17, 19 });//стоп
                socket.Disconnect(false);
            }
        }
Переделал вот так. Теперь при нажатии на кнопку происходит то, что в Form_KeyDown, при отпускании, то что в Form_KeyUp. Образовалась новая проблема: при кратковременном нажатии и удержании (примерно до 3сек) старт и стоп выполняются отлично, но стоит только держать W больше 3 сек, прерывания не происходит. В чем проблема?
Maks3 вне форума Ответить с цитированием
Старый 04.02.2015, 22:42   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Maks3 Посмотреть сообщение
но стоит только держать W больше 3 сек, прерывания не происходит. В чем проблема?
Захлебывается в событиях может??? Вам же советовали поток ... В чем дело?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 05.02.2015, 12:33   #7
Maks3
Пользователь
 
Регистрация: 23.11.2014
Сообщений: 28
По умолчанию

в C# новичок, не знаю как это сделать
Maks3 вне форума Ответить с цитированием
Старый 05.02.2015, 12:48   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Код:
Thread procthread;

        bool interrupt = false;

        public Form1()
        {
            InitializeComponent();
        }
        
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.W)
            {
                interrupt = false;
                procthread = new Thread(Functions);
                procthread.Start();
            }
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.W)
            {
                interrupt = true;
            }
        }

        private void Functions()
        {
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            {
                this.Invoke(new MethodInvoker(() => this.Text = "Connections... wait"));// для отладки

                socket.Connect(IPAddress.Parse("192.168.0.15"), 80);
                byte[] Start = new byte[] { 16, 18, 17, 18 };
                byte[] Stop = new byte[] { 16, 19, 17, 19 };

                while (!interrupt)
                {
                    socket.Send(Start);//старт
                    socket.Disconnect(false);
                    this.Invoke(new MethodInvoker(() => this.Text = "Work"));// для отладки
                    Thread.Sleep(10); // чтобы не DDoc`ил сокет задержку можно и побольше, в зависимости от того кто на другом конце принимает
                }

                socket.Send(Start);//старт
                socket.Disconnect(false);
                this.Invoke(new MethodInvoker(() => this.Text = "Stop"));// для отладки
            }
        }
Вот как то так.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Наззвание на кнопке Милочка C++ Builder 1 26.02.2011 16:51
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Фильтр на кнопке. Stranger333 Microsoft Office Access 2 20.02.2010 14:40
Рисунок на кнопке JIimonKa Общие вопросы Delphi 3 27.05.2008 07:41