| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Нажатие нескольких клавиш. Многопоточность |
| Автор: boobie 23.5.2013, 08:43 | ||||||||
Здравствуйте! Как заставить программу понимать одновременное нажате двух и более клавиш? Т.е. задача, например, такая: 9 (например) Label-ов, при нажатии на клавишу "1" - происходит
при нажатии на "2":
и так далее... При одновременном нажатии на 1 и 3 и 6, например, к соответствующему label-у "прибавляется" 1, 3, 6. Вот код моего решения на примере двух label-ов:
Я создал 2 потока, каждый поток использует функцию getasynckeystate() чтобы определить клавишу, нажатую в данный момент. Если нажата нужная - выполняем изменение строки. 1. Можно ли как-нибудь обойтись без getasynckeystate(), а только силами TForm1.FormKeyPress(Sender: TObject; var Key: Char)? Как сделать так, чтобы данная процедура стала как-бы многопоточной? 2. Обработать нажатие более 3 клавищ в данном случае не получится? |
| Автор: kami 23.5.2013, 09:12 |
| SetWindowsHookEx + WH_KEYBOARD_LL + google должно помочь Потоки не нужны. Обращение к визуальным компонентам из потока = глюк, баг и иже с ними. Добавлено через 1 минуту и 34 секунды это в том случае, если нужно ловить клавиши вне зависимости от активности своего окна. |
| Автор: boobie 23.5.2013, 09:28 | ||
Я изучаю работу потоков... Сам придумываю такие вот задачки...
КАК? ПОЧЕМУ? И что, простейшие программки (любую простенькую игрушку, типа "Морской бой" или простейшую коммерческую прогу) писать на WinApi? На**** зачем тогда VCL нужна в таком виде? |
| Автор: Poseidon 23.5.2013, 10:45 | ||||
Начните изучение потоков вот с этой статьи: http://forum.vingrad.ru/forum/topic-60076.html |
| Автор: boobie 23.5.2013, 10:48 | ||||
| Т.е. для обращения к компонентам VCL нужно использовать один из способов синхронизации потоков? Исользовать метод Synchronize, критическую секцию или что-нибудь в этом роде? Получается, что вся проблема состоит в синхронизации потоков? И только по этой причине нельзя использовать визуальные компоненты в многопоточном приложении? Способов синхронизации потоков достаточно много...
Да, похоже это единственная статья о многопоточности на весь рунет.
|
| Автор: kami 23.5.2013, 12:24 |
нет. Критические секции в этом случае, как и (например) мьютексы не пойдут. К визуальным компонентам можно обращаться только из своего, VCL- потока. Т.е. - Synchronize или (к примеру) собственные аналоги на Send|PostMessage. Я в последнее время перешел на SendMessageTimeout с SMTO_BLOCK. |
| Автор: boobie 23.5.2013, 12:32 | ||
kami, спасибо, теперь понятно. Т.е. Synchronize необходим для любого обращения к визуальному компоненту из потока. Критические секции, семафоры и мьютексы - синхронизация потоков.
WinApi? Чем Synchronize так плох? |
| Автор: kami 23.5.2013, 12:42 |
Он не позволяет передать параметры вызываемому. А в SendMessage я могу запихать всё, что угодно, включая объекты. Смесь Добавлено через 4 минуты и 51 секунду да, и самое главное забыл - SMTO_BLOCK не допустит вложенного вызова, а с синхронайзом такое возможно. |
| Автор: boobie 23.5.2013, 14:09 |
| Хорошо. А как заставить каждый поток обрабатывать нажатие клавиш? Только с помощью getasynckeystate() и других winapi функций? Дело в том, что потоки будут обрабатывать любое нажате клавиши, вне зависимости от фокуса ввода. |
| Автор: Poseidon 23.5.2013, 14:12 | ||||||
Очень плохо прочли, либо не внимательно. Еще раз просмотрите главу 3. И очень внимательно раздел "Дополнительные проблемы с VCL." Судя по вопросам, Вы эту статью бегло просмотрели, а не прочли. Досканальное изучение этой статьи отбросит 99% возможных вопросов по потокам. И не нужно будет выдумывать нереальных задач. |
| Автор: boobie 23.5.2013, 14:57 | ||||
| Да, только после публикации темы понял зачем нужен метод Synchronize. Вот код с учетом ошибок и примененным методом Synchronize:
Код формы:
Но вопросы остались без ответа |
| Автор: kami 24.5.2013, 14:43 |
Без какого ответа? Да, в потоках неприменимы всякие OnKeyPress и т.п. В той же статье пишется, что не стоит плодить потоки только ради потоков. Ну какой смысл в обработке несколькими потоками одного и того же? У каждого из них будет уникальный алгоритм обработки? Имхо, вполне достаточно будет VCL-потока и |
| Автор: boobie 25.5.2013, 07:48 |
| Хорошо, все ясно. Просто я изучаю потоки, для наглядности решил сделать так... |