|
|
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикХотя. Ты используешь модуль System.SysUtils ???? Ну в шапке кода написано - я код свой проверенный, рабочий выложил! У Вас возможно реализация красивее с CASE выглядит, но я свой Тестовый писал не на выставку, а чтоб понятней было что-куда! Посему - не придирайтесь так уж! Для меня важнее было совсем другое! И всеж - я не понимаю, почему Функция в перемешку с Процедурой??? Может всеж правильнее было так(?): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:03 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
AllButtonClick - процедура клика на каждую из кнопок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:06 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Няшик , для меня было важно...эээ, попробую выразиться правильным языком: - важно было то, что передача флагов вполне возможна в Рун-Тайме основного цикла процедуры, при этом процедуры обработки кликов по клавишам отработали как-бы параллельно, выполнив всего лишь одну операцию FlagХ:=True; Остальной анализ и разветвления - уже опять в основной процедуре цикла! Все остальное - мелочи вариантов реализации! И еще - Вы не правильно сделали! Ваши "MMemo.Lines.Add" в CASE отработали в обработчике нажатия клавиш, а Основная процедура осталась без результата нажатия! А для меня именно это нужно было! Можно конечно вместо "MMemo.Lines.Add" написать "FlagХ:=True;", а уже в основной процедуре анализировать их и выполнять нужную ветку. Но все ж! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:26 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicAllButtonClick - процедура клика на каждую из кнопок? Верно. Bellicа чтоб понятней было что-куда! А вышло так, что всех запутал. Неправильно реализованной задачей. BellicФункция в перемешку с Процедурой??? Она не в перемешку, она в своей области видимости. Т.е в общей области недоступна. BellicИ следующие две строчки - исправьте согласно правил Дэлфи! Не понмиаю, что у вас не так. Всё по стандартам record helper for ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:28 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Зачем нужны какие то флаги??? Почитайте о компоненте ApplicationEvents и установите нормальный обработчик для клавиш нажатых Или нужна глобальная область??? (Вне программы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:36 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикА вышло так, что всех запутал. Неправильно реализованной задачей. Я не вижу - в чем запутал всех? Изначально думал, что придется запускать еще один Доп.Поток, но ситуация решилась и без него! Что не так? Она не в перемешку, она в своей области видимости. Т.е в общей области недоступна.Понятно! Просто меня несколько это смутило. Ничего что я ее вывел отдельно? Не понмиаю, что у вас не так. Всё по стандартам record helper for ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:41 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicЧто не так? Описанием задачи. Многие люди, что видят - то и думают, забывая про - то, что ТС сам не знает как реализовать правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:44 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикЗачем нужны какие то флаги???Затем, что получать команду на дальнейшие действия нужно в Рун-Тайме процедуры цикла(обработки инф., подсчета,...)!!! В реальной процедуре идет обработка информации из нескольких открытых файлов, юзеру выводится исходная инфа и предлагается сделать свой выбор - Обработать, Пропустить Шаг или Выйти. Сначало я заюзал Диалоговое окно, но с ним неудобно и криво работать! Поэтому искал методу управления внутри процедуры с кнопок формы, но в том же Рун-Тайме, не закрывая файлов и не теряя значений кучи переменных. Так - понятней? А Тестовый код считаю максимально приближенным к Реальному... Почитайте о компоненте ApplicationEvents и установите нормальный обработчик для клавиш нажатыхА вот за подсказку - при много благодарен! Но похоже изучать и смотреть - пригодиться ли оно мне - уже буду утром!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 03:55 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicважно было то, что передача флагов вполне возможна в Рун-Тайме основного цикла процедуры, при этом процедуры обработки кликов по клавишам Это не основной цикл, а дополнительный и полностью бессмысленный. Основной крутится внутри Application.Run - нормальный цикл, ожидающий события получения сообщения, а не хрень со Sleep и ProcessMessages. Тебе не нужны ни флаги ни цикл. Назначь кнопкам один обработчик (в object inspector на вкладке events) - это и будет твоя "процедура". И установи им разное значение свойства Tag (в object inspector на вкладке properties). Это и будут твои флаги. И в этой своей "основной процедуре" просто пиши if TButton( Sender ).Tag = 2 then... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 04:35 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Не благодари. Поставь компонент ApplicationEvents и на него событие onMessage Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 04:40 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Небольшой фикс Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 05:30 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Няшик, ты знаешь толк в извращениях. Массив, поиск в нем по имени...и все это вместо того, чтобы трем кнопкам проставить Tag от нуля до двух, и сверяться с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 10:28 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Няшику, по последнему коду: TArray<Integer>, надежнее массив NativeUInt'ов, быстрее и проще TArray.BinarySearch, хотя в случае четырёх членов, думаю, пофиг. YuRockЭто не основной цикл, а дополнительный и полностью бессмысленный. Я так понимаю, что у него всё крутится в одном потоке и ему нужно как-то 'придержать' работу кода до нажатия на кнопки, которые находятся на форме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 10:54 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Vizit0r, +1, проще case по тэгу. для четырёх то кнопок ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 10:55 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Много думал, почему няшик так хитро делает. То названия, то зачем-то хендлы (причем не совсем верно - handle не integer ни разу, можно нарваться на глюки). Почему не просто tag? Боюсь, няшик, что картинку, которую ты постил, можешь применить и к себе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 11:02 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Ладно, за деревьями леса не видно, как обычно :) Мой хрустальный шар выдал следующее. ТСу нужно что-то считать. Потом остановить счет, дождаться реакции нажатия на кнопку на этой же форме, где идёт расчет, и дальше продолжить, возможно в зависимости от того, что нажали. Если 'расчет' довольно быстрый, то, думаю, можно попробовать основным потоком обойтись. В общем - ждём пока нормального описания того, что нужно. Иначе можно долго гадать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 11:10 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикНе благодари. Поставь компонент ApplicationEvents и на него событие onMessage Код: pascal 1. 2. [dcc32 Error] Main_Module.pas(166): E2010 Incompatible types: 'System.TArray<System.Integer>' and 'Set' !!! Возможно я не прав, Няшик , а Ваша процедура через себя все События Windows будет пропускать? Может для начало нужно было отловить нажатие левой кнопки мыши (WM_LBUTTONDOWN), а потом проанализировать - а не по нужной ли кнопке мацнул юзер? Или из WM_COMMAND можно сразу Хэндл кнопки узнать?! Я не иронизирую вовсе, просто в этих делах мало пока понимаю! Посему - убедительно прошу, проверяйте свой код перед публикацией и желательно с компиляцией - не хочется искать ошибки в чужих творениях! Кстати - Вы привели обработчик событий, а что же в это время будет делать основной цикл в Осн.процедуре? Я про вот это имел ввиду: Код: pascal 1. 2. 3. 4. 5. 6. 7. makhaonЯ так понимаю, что у него всё крутится в одном потоке и ему нужно как-то 'придержать' работу кода до нажатия на кнопки, которые находятся на форме.Браво!!! Совершенно верно! я вроде так и объяснял, не вдаваясь в подробности, даже Тестовый код приближенный к реальному воспроизвел! Только маленькое уточнение! - Не "придержать работу", а после выбора юзером - продолжить выполнение по алгоритму, пропустить его часть или выйти с сохранением результата, полученного на это время. makhaonТСу нужно что-то считать. Потом остановить счет, дождаться реакции нажатия на кнопку на этой же форме, где идёт расчет, и дальше продолжить, возможно в зависимости от того, что нажали. Если 'расчет' довольно быстрый, то, думаю, можно попробовать основным потоком обойтись.И тут - Ваш хрустальный шар правильно предсказал!..))) makhaonВ общем - ждём пока нормального описания того, что нужно. Иначе можно долго гадать.Уже и не знаю, как упростить описание "Задания", что бы не грузить лишней информацией!? Ну не всю же процедуру сюда реальную копировать? Есть предложение - давайте я попробую еще раз сформулировать задачу, но пусть это будет уже Новый топик, ибо этот звучит как "Обработка нажатия трех кнопок в параллельном потоке", а о потоках вроде как уже не говорим! Модераторы могут возмутиться! Иль тут продолжить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:06 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Vizit0rМассив, поиск в нем по имени...и все это вместо того, чтобы трем кнопкам проставить Tag от нуля до двух, и сверяться с ним. Можно даже проще. Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:13 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicУже и не знаю, как упростить описание "Задания", что бы не грузить лишней информацией!? Ну не всю же процедуру сюда реальную копировать? Нет, процедуру не надо уже, упаси бог. Нужно "Задание" сюда скопировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:16 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Понятно, я так и думал. Можно попробовать сделать так: 1. Считаем всё до момента необходимости выбора. 2. Включаем visible, либо, лучше, делаем enable кнопкам. 3. Ждём безо всяких циклов когда юзер нажмёт какую-то кнопку. 4. В обработчиках OnClick кнопок развешиваем остальные куски кода, в зависимости от того, что нажмут. Согласен, что батонокидательство. Но, думаю, в этом случае, допустимое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:18 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockМожно даже проще. Код: pascal 1. Не пойму - зачем лишние проверки и массивы? Чем плох код из этого сообщения? Тем, что на каждой из кнопок - мизерный обработчик висит? - Возможно можно написать и Общий обработчик для трех кнопок, но тогда внутри него придется развернуть анализ...( Или Три флага смущают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:22 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicно тогда внутри него придется развернуть анализ Это именно этот анализ: Код: pascal 1. И, это, еще так можно писать, чтоб точно враги не догадались: Код: pascal 1. (это я к тому, что булево значение уже не надо сравнивать с True, вообще не надо ни с чем сравнивать, оно готово для использования в условиях - if Flag2 then) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:34 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Плох Application.ProcessMessages + Sleep. Тем, что занимает ресурсы, сильно ухудшает отзывчивость программы, заставляя основной поток спать, потенциально может привести к трудноуловимым багам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:34 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicзачем лишние проверки и массивы? Т.ч. проверок столько же, только лишних переменных, обработчиков и логики меньше. А зачем массивы - я тоже не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:34 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
авторно тогда внутри него придется развернуть анализ Вот весь анализ Код: pascal 1. 2. 3. 4. 5. Тэги в кнопках проставить только. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:37 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39578878&tid=2041379]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 522ms |

| 0 / 0 |
