|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.12.2017, 15:04 | #1 |
Новичок
Джуниор
Регистрация: 21.12.2017
Сообщений: 2
|
Выполнение действия по событию
Доброго времени суток!
Я новичок в C#. Пытаюсь реализовать маленькие проектики, которые сам же и придумываю, чтобы набраться опыта. Сейчас хочу реализовать программку - триггер бот и столкнулся с проблемой. Прошу помощи! Суть программы:
Я не знаю какой подход будет правильным в реализации этой задачи. Пробовал просто банально в метод прописать бесконечный цикл: Код:
Пробовал так же в конце метода вызывать его повторно, результат тот же. Что я хочу от вас ?: Прошу помочь выбрать правильный путь и решение это задачи. Расскажите что правильно использовать для решения такой задачи? Так же хотел бы увидеть наброски кода. Как сделать эту задачу максимально простой - максимально ресурсоёмкой. И давайте упростим задачу, чтобы было легче разобраться в проблеме: - На форму добавим текст бокс, в который просто будем записывать цвет пикселя (Это я могу сделать). - И задачей будет: Мониторинг в реальном времени, то есть как только будет изменяться цвет пикселя (например под пиксель подведут картинку), так сразу в текст боксе будет меняться текст. |
21.12.2017, 23:10 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Забудьте такую вещь как реальное время, когда работаете в винде. Кратковременное изменение пикселя всегда можете прозевать, такова особенность ОС. Можно конечно посмотреть, например, в сторону создания драйвера монитора и в нём цвет ловить, но тут явно не тот случай.
Можно по таймеру проверять пиксель. Типа примерно раз в мс проверяется пиксель. Или же вынести в отдельный поток свой бесконечный цикл, чтобы программа не "зависала". Или на async/await написать бесконечный цикл и не возиться вручную с потоками. |
22.12.2017, 00:03 | #3 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Видимо потому что вы выполняли это в основном (UI) потоке, вот он и не смог обрабатывать сообщения и обновлять UI.
Либо создавайте новый поток (Task, BackgroundWorker, Thread, ...), либо используйте таймер. Если поток, то стоит добавить например небольшой Sleep в цикл, чтобы не грузить процессор зря. https://en.wikipedia.org/wiki/Busy_waiting
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
22.12.2017, 13:32 | #4 |
Новичок
Джуниор
Регистрация: 21.12.2017
Сообщений: 2
|
Спасибо большое! Понял свою ошибку. Действительно, проблема была в том, что я выполнял этот бесконечный цикл в основном (UI) потоке. Получается, что все вычисления желательно выполнять вне потока, в котором обрабатывается UI, так? Или, как минимум, выносить хотя бы тяжёлые вычисления за этот поток?
Теперь появилась еще одна загвоздка: Программа отрабатывает правильно, подумал, что осталось только немного оптимизировать и по мелочи добавить функционал такого рода как "Запуск по нажатию клавиши.., стоп по нажатию клавиши..", но не тут то было! Проблема заключается в выполнении клика мыши. В винде, на Windows Forms клик отрабатывает, а вот в игре не воспринимается.. Игра открыта в оконном режиме, цвет пикселя фиксируется правильно и проверка отрабатывает, проблема именно в клике левой кнопки мыши. Сейчас клик реализован так: Код:
Последний раз редактировалось DmitryCREDO; 22.12.2017 в 13:51. |
22.12.2017, 22:51 | #5 |
Пользователь
Регистрация: 16.04.2017
Сообщений: 94
|
DmitryCREDO, Application.DoEvents() вам в помощь: этой командой вы говорИте "винде", что ваши действия или расчеты могут занять много машинного времени. - и на это не нужно обращать оной внимания.
Пусть работает, как работает(Винда). Можете эту команду объявить перед "серьезным" циклом, который проц грузит по-полной, перед опросом COM-портов, прочее. (Это чтоб не зависало). >>Прошу помочь выбрать правильный путь и решение это задачи. Расскажите что правильно использовать для решения такой задачи? Так же хотел бы увидеть наброски кода. Как сделать эту задачу максимально простой - максимально ресурсоёмкой. Может быть, минимально ресурсоёмкой? Последний раз редактировалось vaDS; 22.12.2017 в 22:57. |
22.12.2017, 23:10 | #6 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Со всеми последствиями этого. Например возможностью снова нажать кнопку запускающую этот цикл. Или закрыть окно (при этом цикл продолжит работать).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 22.12.2017 в 23:12. |
|
22.12.2017, 23:46 | #7 | |
Пользователь
Регистрация: 16.04.2017
Сообщений: 94
|
Цитата:
Alex11223, Вы ж программируете на VB6 и на VB.NET, неужели никогда не сталкивались с DoEvents()? Последний раз редактировалось vaDS; 22.12.2017 в 23:50. |
|
23.12.2017, 00:07 | #8 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Причем тут винда? Вы читали мое сообщение? Я говорю, что этот метод просто обрабатывает сообщения в очереди. Можете в документации посмотреть если не верите.
И да, на VB я никогда не писал.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
23.12.2017, 00:24 | #9 | |
Пользователь
Регистрация: 16.04.2017
Сообщений: 94
|
Цитата:
Этот метод говорит ОС(Винде) что мы грубо говоря "ЗатормОзим систему", но ты, Система, продолжай свои действия, и не обращай внимания на нас. Нет, эта функция говорит что "здесь будут сложные расчеты", и что не нужно меня в очередь записывать на обработку(я буду тупо и долго считать) в вашей терминологии. А вы со своими задачами можете становиться в очередь или как вы там поступаете. Последний раз редактировалось vaDS; 23.12.2017 в 00:33. |
|
23.12.2017, 00:43 | #10 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Вы документации не верите?
https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx Цитата:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выполнение действия через промежуток времени | chingiz | Общие вопросы Delphi | 37 | 03.10.2012 11:33 |
Выполнение действия над другими прогами. | webprogrammer | Помощь студентам | 2 | 24.03.2012 22:01 |
Символ и выполнение действия | grafgrial | Общие вопросы Delphi | 5 | 27.12.2011 15:00 |
Выполнение действия с компонентами в цикле | Ermiss | Общие вопросы Delphi | 4 | 01.11.2007 23:54 |
Выполнение действия в заданное время | WOWan234 | Помощь студентам | 6 | 02.05.2007 01:52 |