|
|
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Озадачился реализацией данного способа, а опыта работы с потоками вообще нету..( Попробую словесно описать суть задачи - Имеется форма и Основная процедура, которая производит какие-то вычисления - на форме кроме разных полей, имеется Три кнопки: " Заменить ", " Пропустить " и " Выход " - в определенный момент Основной процедуре нужно передать определенные значения или пустить ее по одному из трех направлений, в зависимости от выбора пользователя из трех кнопок. Сразу скажу - по определенным причинам, применение Диалоговых окон мне не подходит! Реализацию алгоритмически вижу примерно так: - внутри Основной процедуры в Осн.потоке пишем бесконечный цикл с анализом внутри трех Флаг-переменных - например Zamena , Propusk , Vihod : Boolean ; - перед этим бесконечным циклом запустить Доп.поток с тремя процедурами обработки клика на соответствующие клавиши, внутри каждой из которых будут меняться Флаг-переменные; - т.о. получив нужные флаги внутри бесконечного цикла, Осн.поток останавливает Доп.поток и продолжает выполнение Основной процедуры. По моему - сей алгоритм можно реализовать с помощью потоков!? Может быть кто либо уже реализовывал его или есть похожие варианты кода?! P.S. По случаю - поздравляю всех форумчан и Администрацию с наступающим 2018 годом!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 17:09 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic- внутри Основной процедуры в _Осн.потоке_ пишем бесконечный цикл с анализом внутри трех Флаг-переменных - например *Zamena*, *Propusk*, *Vihod*: *Boolean*; - перед этим бесконечным циклом запустить _Доп.поток_ с тремя процедурами обработки клика на соответствующие клавиши, внутри каждой из которых будут меняться Флаг-переменные; Наоборот. Всем GUI и в том числе кнопками должен заниматься исключительно основной поток. Дополнительный поток - делает всю продолжительную работу, подчиняясь командам из основного. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 17:45 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНаоборот. Всем GUI и в том числе кнопками должен заниматься исключительно основной поток. Дополнительный поток - делает всю продолжительную работу, подчиняясь командам из основного. И что мешает Три процедуры обработки нажатия кнопок написать в отдельном модуле, запустить в Доп.потоке, а в Основном - закрутить в цикле анализ Флагов? Т.е. как я описал - не получится сделать? Я просто хочу отказаться от отдельного Диалогового окна в Осн.процедуре, а кнопки разместить на форме! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 17:56 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Я видимо понял! Создав Доп.поток нужно в нем запустить какую-либо процедуру, а в моем алго - лишь три обработчика нажатия клавиш!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:06 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicа в Основном - закрутить в цикле анализ Флагов?В основном потоке и так беспрерывно крутится цикл обработки сообщений. Зачем еще один? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:07 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockВ основном потоке и так беспрерывно крутится цикл обработки сообщений. Зачем еще один? Цикл анализа реакции выбора Юзера, цикл опроса Флаговых переменных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:14 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Ведь когда вызывается обычное Диалоговое окно - с момента его Вывода на экран и до нажатия кнопок - тоже ведь внутри идет цикл опроса клавиш, по сути!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:16 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock Зачем еще один? YuRock , предложи тогда свой вариант - отказа Диалог.окон и переноса кнопок на основную форму! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:19 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicЦикл анализа реакции выбора ЮзераДля этого существуют события баттонклики. По сути - орабатываются сообщения wm_command. Bellicцикл опроса Флаговых переменных... Вот его и запихни в доппоток, и при изменении - кидай сообщение основному, что надо что-то изменить в отображении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:22 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
какой-то поток сознания. Работа делается в отдельном потоке. Хоткеи срабатывают в основном окне, в обработчике делаются нужные действия с "рабочим" потоком. Проблема-то в чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:23 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicВедь когда вызывается обычное Диалоговое окно - с момента его Вывода на экран и до нажатия кнопок - тоже ведь внутри идет цикл опроса клавиш, по сути!?Это только в VCL такая костыльноглючная технология используется для модальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:23 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockВот его и запихни в доппоток, и при изменении - кидай сообщение основному, что надо что-то изменить в отображении. Этого нельзя сделать! В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!! Все решается обычным Диалоговым окном!!! Но мне Диалог не подходит!!! Необходимо, что бы кнопки принятия решения были на самой форме! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:29 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicЭтого нельзя сделать! В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!!Именно по этому и надо всё это перенести в доп поток, раз много работы. А выбор юзера сделать перед началом этой работы. Ведь это же бред, когда юзер должен 10 минут сидеть ждать, пока программа его попросит сделать выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:33 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockBellicЭтого нельзя сделать! В Основной процедуре открыта куча файлов, задействовано много циклов и переменных, процедура еще выполняется, просто в ОДИН момент нужен выбор юзера, и все!!!Именно по этому и надо всё это перенести в доп поток, раз много работы. А выбор юзера сделать перед началом этой работы. Ведь это же бред, когда юзер должен 10 минут сидеть ждать, пока программа его попросит сделать выбор. Юзер не будет ждать! Даже наоборот - ему придется быстро оценивать промежуточные результаты в Эдитах и прочих полях, и нажимать нужную кнопку! Именно по этому я хочу и отказаться от Диалогового окна, ибо оно закрывает собой часть осн.формы, передвинут его в сторону в ручную - потерять время! Программно разместить например в углу экрана - тоже не вариант - отвлечение внимания юзера и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 18:44 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicЮзер не будет ждать!Не понятно тогда, зачем другой поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 20:03 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, не убеждай его, бесполезно. Клиент должен дозреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2017, 22:35 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Парни, видимо меня сильно ругать кое-кто будет сейчас?!..)) Но весь код уместился в Основном модуле и без открытия дополнительных потоков: Тестовый код (палками сильно не бить!..))) Код: 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. Возможно будут замечания и к Тестовому коду, к циклам или же к "GOTO"-переходу, но тут важна сама суть - пока процедура "крутится" в цикле между МЕТКА-ми (выделено желтым цветом), анализируя три флага, пользователь приняв решение может нажать одну из 3-х кнопок. P.S. Поиски в Интернете показали другой вариант - с анализом WM_LBUTTONDOWN, или WM_COMMAND, а потом чтением и анализом Хэндла кнопки... но у меня пока так и не получилось его реализовать. В этом случае по моему можно было вообще обойтись без отдельных процедур - обработчиков нажатия кнопок!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 01:07 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Может кто нибудь мне - умственно отсталому человеку объяснить.... На кой чёрт потоки и бесконечные циклы???? Можно же было всем объектам назначить коллбэк один, или вызов доп коллбэка. И уже там творить все делишки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 01:45 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикНа кой чёрт потоки и бесконечные циклы???? Можно же было всем объектам назначить коллбэк один, или вызов доп коллбэка. И уже там творить все делишки. Дополнительного потока в крайнем коде - как видите нету! А бесконечный цикл (тот что выделен цветом) - в ожидании изменения флагов... Лучше напишите реально работающий свой вариант с "одним коллбэком"..)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 01:55 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:07 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Вообще, судя по Sleep(500) - там запланировано выполнение чего-то длительного, поэтому почти всё что в процедуре ".SButtonClick()" нужно вынести в отдельный поток и уже из него анализировать состояние этих флагов. А вообще, бесконечные циклы, да ещё и со Sleep() в ГУИ потоке - не надо так, пользователи вас за подвисающий интерфейс будут очень долго любить... часто вспоминать... малым загибом... ну и так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:07 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
alekcvpВообще, судя по Sleep(500) - там запланировано выполнение чего-то длительногоSleep(500) - это задержка, чисто в тестовом коде, чтоб счет был не таким быстрым!.))) поэтому почти всё что в процедуре ".SButtonClick()" нужно вынести в отдельный поток и уже из него анализировать состояние этих флагов.Зачем еще поток? И так ведь все работает? А вообще, бесконечные циклы, да ещё и со Sleep() в ГУИ потоке - не надо так, пользователи вас за подвисающий интерфейс будут очень долго любить... часто вспоминать... малым загибом... ну и так далее.Тестовая программа - не зависает, а Пользователи - исключительно только я, ну может с друзьями поделюсь!..)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:32 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Няшик, уточните плизз код вот тут: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Начинается процедура, затем Функция... а вот Код: pascal 1. моя DX вообще не поняла! У Вас ваш код работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:42 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Эта функция нужна, что бы найти в массиве индекс элемента. Дабы, что бы по этому индексу обратится к коллекцию case по нужному адресу. Код полностью рабочий, и никаких задержек не надо. Хотя я кое что не дописал. Надо ещё в case добавить 3 пункт (3: exit;), дабы при нажатии второй раз кнопки SButton не вылетал флаг в false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:48 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Хотя. Ты используешь модуль System.SysUtils ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 02:51 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, Понятно, я так и думал. Можно попробовать сделать так: 1. Считаем всё до момента необходимости выбора. 2. Включаем visible, либо, лучше, делаем enable кнопкам. 3. Ждём безо всяких циклов когда юзер нажмёт какую-то кнопку. 4. В обработчиках OnClick кнопок развешиваем остальные куски кода, в зависимости от того, что нажмут. Согласен, что батонокидательство. Но, думаю, в этом случае, допустимое. Из всего этого все понятно и так есть и будет! Уже давно пользуюсь "Enabled кнопкам"..)) ... А теперь хотелось бы увидеть Ваше решение 3 -го пункта!!! ... У меня до этого было примерно так (Это и было Вашим 3-м пунктом! - Ожидание!): Код: pascal 1. 2. Ну а после этого - анализ ответа (Rez) и соответственно свой код. Но этот модальный Диалог мне мешал: 1. Если не позицировать его - мешал анализу данных других полей на форме; 2. Если убрать куда-нибуть в угол - как то не "Айс"; 3. Модальность не позволяла при необходимости скопировать инфу из Мэмо или Эдитов; 4. ... Нужно было как то избавиться от Диалога, воспроизведя кнопки на форме и смоделировать режим "Ожидания"... Вот! P.S. Было еще одно решение, но в силу опять же "модальности", оно тоже было отброшено! Это было маленькая форма с этими тремя кнопками, без шапки и боковых границ, ... она позиционировалась в нужное место на Осн.форме и кнопки выглядели, как будто принадлежащие Осн.форме... В общем - это к делу не относится!..)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:46 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Да, я уже понял твою проблему. авторА теперь хотелось бы увидеть Ваше решение 3-го пункта!!! Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 12:52 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
makhaon(это я к тому, что булево значение уже не надо сравнивать с True, вообще не надо ни с чем сравнивать, оно готово для использования в условиях - if Flag2 then) я прекрасно об этом знаю! Это - мелочи Тестового кода, не стоило в это место меня носом тыкать!..))) makhaonПлох Application.ProcessMessages + Sleep Я уже ответил по этому поводу, читайте выше! Sleep - только лишь тут в Тестовом коде, дабы замедлить счет от 0 до 5 и от 5 до 10! Application.ProcessMessages - для того, чтоб опять таки в Тестовом коде в шапке формы не видеть "Не отвечает". Вот весь анализ Код: pascal 1. 2. 3. 4. 5. Тэги в кнопках проставить только. Мне эта идея больше нравится, чем массивы!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 13:01 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
makhaonДа, я уже понял твою проблему. Решение без кода :) Просто - ждём до тех пор, пока юзер что-то нажмёт. Как только нажал - считаем дальше. Совсем не обязательно счетную процедуру делать в пределах одного метода. Я не понимаю выражения "просто ждем"! В варианте с Диалоговым окном - понятно было в каком месте это ожидание! А как в Вашем варианте заставить, к примеру цикл, "просто ждать" ну скажем в своем i/2 -состоянии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 13:10 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, что влезаю опять. BellicЯ не понимаю выражения "просто ждем"! Ну есть 2 варианта: 1. "Ждем" - это ждем наступления события; 2. "Просто ждем" - вообще ничего не делаем. Bellicзаставить, к примеру цикл, "просто ждать" Никак. Цикл не нужен просто. Скорее всего, не смотря ни на что. Хотя то, что нужно, до сих пор тайна, но я уверен, что не нужен, и хватит одного цикла обработки сообщений (который и так есть), который и события действий пользователя обрабатывает. Просто ничего не нужно. Нужно вызвать какую-то процедуру при запуске программы и затем вызывать какие-то процедуры при нажатии на кнопки, всё. Всё, пока не будет известна задача. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 13:23 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Vizit0r, makhaon. Как вы tag то в OnMessage отловите ???? Я первым делом попытался это сделать, и не было ничего в структуре tagMSG Насчёт handle да, надо было NativeUInt ... Была глубокая ночь, под утром. BellicМожет для начало нужно было отловить нажатие левой кнопки мыши (WM_LBUTTONDOWN), а потом проанализировать - а не по нужной ли кнопке мацнул юзер? Или из WM_COMMAND можно сразу Хэндл кнопки узнать?! У меня так и реализована, проверка нажатие кнопки. + Проверка, на какую нажали по handle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 13:26 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Циклы к слову вообще не нужны, уже есть ApplicationEvents Можно и так сделать ведь Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 13:34 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock , Вы похоже так "Задачу" и не поняли в отличие от makhaon !...((( А знаете почему? - Потому, что мыслите стандартно! - По Вашему, раз есть Обработчики событий, то и целостный код нужно "поделить" между ними и заново переписать весь алгоритм!? Предприму "крайнюю" попытку, лично для Вас на тестовом коде сымитировать и описать Задачу: (только слезно прошу - не переделывать цикл под свое мышление! - Это всего лишь имитация Реального кода!) Имеется код с Диалогом Код: 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. Задача: Избавиться от Диалогового окна и не нарушая алгоритма процедуры и не разваливая ее на 3-4 отдельных, "перенести" три кнопки на форму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:27 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic YuRock , Вы похоже так "Задачу" и не поняли в отличие от makhaon !...((( Можно на ты? Так проще. Bellic не разваливая ее на 3-4 отдельных Почему ты так боишься упрощения кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:32 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Да.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов. Вот его останавливай - запускай, задавай время через сколько он будет срабатывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:42 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicПредприму "крайнюю" попытку, лично для Вас Спасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде. Если она вызывается в FormCreate и будет "крутиться" постоянно, то действительно нужен отдельный поток. В этом случае надо четко определить состояния результата твоего расчета и когда будет какой-то результат - посылать об этом сообщение главному потоку и ожидать от него команды на продолжение. Но я в этом до сих пор, мягко говоря, не уверен. Я уже 2 раза просил объяснить задачу, а не показывать "тестовый код". Русским языком объяснить, что тебе заказчик (или препод или кто там) заказал сделать. Твои "тестовые коды" только уводят всё дальше и дальше от понимания задачи не только окружающих, но и тебя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:42 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикДа.. Если нужен цикл, то используй таймер. Он уже как бы почти в потоке работает. И выполняй код без тормозов. Массивы ввели, теперь таймер. Еще надо COM использовать и дотнетовскую библиотеку прикрутить через прослойку-сервер приложений. Для упрощения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:44 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, Таймер то лучше использовать, чем for с sleep и ProcessMessages Это правильный вариант (Таймер) И самый простой ... Я думаю пользователь делает игру для развития умственных способностей, выполняя действий подсчёт чего - либо то, и нахождения совпадений и так далее Судя по последнему примеру ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:48 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockПочему ты так боишься упрощения кода? YuRock , зачем этот вопрос? Я ведь технически грамотно вроде поставил задачу на Тестовом примере? Или ты хочешь услышать - что делается в Реальной процедуре, или даже увидеть? я ведь уже немного писал о ней! Там открыто на чтение 2 файла, идет цикл побайтового их сравнения (автоматом), и при особых ситуациях требуется Решение оператора, в 3-й файл попадают результаты, на форме - 4 текстовых эдита с промежуточными результатами и еще Окошко типа как в Hex-редакторе (Оффсеты, Нех-значения и литеральное соответствие). И ты хочешь эти открытые файлы и процедуры взять и закрыть и потом опять их дергать открывание-закрывание и передачей переменных между процедурами? Нет уж!!! Кстати - есть аналогичная и Автоматическая процедура, которая отрабатывает от начала и до конца без "тычков" оператора. Ручная процедура была просто скопирована с Автоматической и дополнена Диалоговым окном и обработкой его результатов. (Возможно можно будет в будущем оба варианта (Авто и Ручной) сделать для экономии в одной процедуре, но это сейчас не важно.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 14:53 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Что мешает открыть файл в одном месте - держать на него ссылку ??? Даже если мы и закрываем файл, мы можем запомнить на какой позиции чтения было закрыто. И при открытии сделать offset .... Или ты читаешь файл целиком???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:09 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
ИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:10 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockСпасибо, конечно. Но этот "крайний" код не работоспособен. Ведь TestCode() даже не вызывается нигде. TestCode() вызывается единственной кнопкой на форме SButton: TButton ; Неужели это трудно увидеть или догадаться, раз есть Одна процедура, то ее нужно запустить! Тестовый код - полностью работоспособен!!! - Я же не на бумажке рисую, как Няшик с ошибками!?..))) ( Вот ссылка на полный исходник Теста ) А это - Форма: Текст файла формы "Main_Module.dfm": Код: 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. YuRockЯ уже 2 раза просил объяснить задачу, а не показывать "тестовый код". Русским языком объяснить, что тебе заказчик (или препод или кто там) заказал сделать. Твои "тестовые коды" только уводят всё дальше и дальше от понимания задачи не только окружающих, но и тебя. Меня лично никто никуда не уводит, и вы тоже не убегайте!.))) Я Задачу поставил - если хотите, решите ее с моими поставленными условиями! Не можете понять или не хотите тратить время - воля Ваша! Кратко: Задача, просто избавиться в теле цикла от Диалогового окна с 3-мя кнопками, создав аналогичные кнопки на самой форме, при этом не делить цикл на части(процедуры). Куда уже проще описать без тестового кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:15 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикЧто мешает открыть файл в одном месте - держать на него ссылку ??? Даже если мы и закрываем файл, мы можем запомнить на какой позиции чтения было закрыто. И при открытии сделать offset .... Или ты читаешь файл целиком????Запомнить можно все и не важно как читается файл(в Memory, TByte, ... или FileStream) - я уже написал, что задача "избавиться от Диалогового окна", не переделывая всю процедуру... Читай выше! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:28 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicЯ ведь технически грамотно вроде поставил задачу на Тестовом примере? Мне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно? Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу): Код: 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. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. (Во вложении - проект. Играйся.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:33 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикИЗ тс-а вытягивают инфу силой, вымогая - а он суёт свои тестовые коды, где нет подробности информации .... А он думает, что все должны понять его мысль - которую он и сам не может реализовать Знаешь, становится похожим на короля из Мультика "Бременские музыканты", который просто хотел на завтрак съесть кусочек масла, а придворные из этого желания сделали проблему! Я привожу Вам всем простую Задачу ( как просто кусочек Масла ), а Вы требуете какие то подробности( может быть нужна инфа по Жирности масла, дате его изготовления, сроке годности или производителе? ), которые принесут еще больший головняк и Вам и мне! Нафига спрашивается? Или Вы просто насмехаетесь надо мной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:36 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockМне уже настолько надоело, что стало интересно . Вот это - то, что тебе нужно? Твой тестовый пример на потоке (возможно есть баги, но на глаз я не вижу): Ругнулось при открытие на отсутствие "Project.res", но пересоздала его...) У меня все работает, согласно "Задаче"... Класс!!! Но лично мне еще "вкурить" это все нужно! Единственное на взгляд - очень много процедур добавилось, но это не критично, я не придираюсь! Ну и вопрос - в принципе, обязателен ли тут был Поток? Без него - какие варианты еще есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:51 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicочень много процедур добавилось Процедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag BellicНу и вопрос - в принципе, обязателен ли тут был Поток? Любую задачу можно решить в одном потоке. Иногда это идеальный вариант. Но ты же хранишь условие задачи в секрете, откуда я знаю. BellicБез него - какие варианты еще есть? Только такие, которые будут тормозить интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 15:59 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Вот так я бы насписАл надцать лет назад и не парился: Код: 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. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. А сейчас что-то как у 21080208 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 16:07 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, на форму кидаешь панельку с тремя (или сколько нужно кнопками), делаешь её не активной, в фомре объявляешь переменную, например FRes: integer, а вместо Rez := MessageDlg вставляешь код Код: pascal 1. 2. 3. 4. При этом в обработчиках кнопок FRes присваиваешь нужное значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 16:10 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockПроцедуры btnContinueClick, btnSkipClick, btnStopClick легко превращаются в одну с помощью Tag Это понятно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 16:15 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicМожете меня расстрелять, но Он прекрасно работает!..))) Попробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 16:57 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Freedoom , очень интересно получилось! Класс! (Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!) Архив проекта прилагается ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:02 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic Freedoom , очень интересно получилось! Класс! (Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!) Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:06 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
softwarerПопробуй, пока он работает, нажать, скажем, крестик в правом верхнем углу.Ничего не произошло, и по крайней мере от Крестика я буду избавляться вообще! Ну нельзя закрывать окно посредине открытого цикла! Но это уже мелочи и совсем другая история... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:15 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicНу нельзя закрывать окно посредине открытого цикла!Даже если пользователь передумал ждать окончания твоего цикла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:19 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockЖаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого. Тормозов не наблюдается, а скачек нагрузки на CPU - c 25 до 50%. Это много? Можно если захочется - таймером ворон на ветках посчитать!..))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:26 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockДаже если пользователь передумал ждать окончания твоего цикла?Выход из процедуры будет возможен только по кнопке Выход, с корректными действиями. А сам расчет (в Тестовом варианте - это счет от 0 до 500 и от 501 до 1000 и т.д.) в Реальном цикле выполняется достаточно быстро, так что юзер и не успеет мышкой на Крестик навести (Если он его еще сумеет найти на форме)!..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:32 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicа скачек нагрузки на CPU - c 25 до 50%. Это много? Значит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом. А если бы было одно ядро - нагрузка была бы 100. Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить. Много это или не много - пользователям твоей программы решать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:34 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockЗначит у тебя 4 процессора (ядра). На одном уже "работала" подобная "программа", а эта запустилась на другом. А если бы было одно ядро - нагрузка была бы 100. Но не отчаивайся, и на многоядерных компьютерах, все программы, GUI-поток которых работал на том процессоре, который ты отправил в кому, будут тормозить. Много это или не много - пользователям твоей программы решать.Да, верно, у меня 4 ядра!..) С Одним ядром - это Pentium-1 что ли? Так мой уже такой давно на свалке!..)) А программа реальная - для узконаправленного круга пользователей пишется - для себя, ну максимум еще может для 2 -х других друзей! Ну а будут тормоза - можно и твоим Потоковым вариантом воспользоваться! - Он судя по индикатору - вообще не грузит процессор!..) Надеюсь проблем, обращения из Потоковой процедуры к другим функциям и процедурам, не должно быть?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 17:59 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
BellicС Одним ядром - это Pentium-1 что ли? В твоём случае, если б у тебя было 2 ядра, оба стали б заняты (т.к. 1-е уже кто-то занял). Не, если не жалко электроэнергии и нервов, плевать на прокляться благодарных пользователей - я ж не против. BellicПотоковой процедуры к другим функциям и процедурам, не должно быть Функциям и процедуры, как и память, не принадлежат какому-то потоку. Их можно использовать из любого. Только поток кода будет хоть и одинаков, если вызывать одну функцию в разных потоках, но их будет несколько, а вот память - одна на всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:08 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicскачек нагрузки на CPU - c 25 до 50%. Это много? Это полный П. У правильно написанной программы в покое должно быть нулевое потребление ЦПУ. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:13 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock , Кстати - добавил Sleep(1); в ЭТОТ КОД , и процент загруженности вообще упал, проверь: Код: pascal 1. 2. 3. 4. 5. - Без Sleep(1) -- 25-27% в ожидании нажатия клавиш; - Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:18 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Продолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:25 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:26 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, А теперь попробуй закрыть программу крестиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:30 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic YuRock , Кстати - добавил Sleep(1); в ЭТОТ КОД , и процент загруженности вообще упал, проверь: Код: pascal 1. 2. 3. 4. 5. - Без Sleep(1) -- 25-27% в ожидании нажатия клавиш; - Со Sleep(1) -- загрузка в ожидании практически не увеличилась (1-5%)! Не хочу я пробовать Это мрак. Что со слипом, что без. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:41 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
rgreatBellic, А теперь попробуй закрыть программу крестиком. rgreat , Вы похоже Тему вообще не читаете!? ВОТ ТУТ я уже ответил на этот вопрос! Ну нету у меня на Реальной форме КРЕСТИКА!!! На Тестовой форме он конечно имеется, но я не буду туда нажимать! Я форму создавал сразу без крестиков, значков сворачивания и минимизаций! Что бы потом вопросов не было!..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:44 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Беллик, сделай нормально, правда :) Тебе же самому будет лучше и проще потом. Не надо потоков бояться, всё там с ними просто, если один раз разобраться. ProcessMessages - это, как правило, костыль, хоть со слипом, хоть без. Рано или поздно он гарантированно вылезет боком. Причём в таком месте, что вообще никак не связано напрямую с кодом. И вот тогда всю голову сломаешь, почему глючит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:49 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикПродолжаем дальше фигнёй страдать??)) А вот воспользовались бы таймером, даже в потоке. То не пришлось бы заниматься такими оптимизациями)))А кто Вам мешает написать свой вариант на основе моего Тестового и приложить к сообщению полный рабочий проект(без ошибок ток)? Тем более, applicationevents сообщит о нажатии клавиши. И вообще не надо никаких собственных крутых for-ов Няшик , мне на пиво братишка позвал, к сожалению вернусь только завтра, но я хотел бы Заценить и Ваш вариант с Таймером и Эвентсами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:53 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, Хех, присоединюсь к остальным: Страдай фигней, на здоровье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 18:57 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
makhaonБеллик, сделай нормально, правда :) Тебе же самому будет лучше и проще потом. Не надо потоков бояться, всё там с ними просто, если один раз разобраться. ProcessMessages - это, как правило, костыль, хоть со слипом, хоть без. Рано или поздно он гарантированно вылезет боком. Причём в таком месте, что вообще никак не связано напрямую с кодом. И вот тогда всю голову сломаешь, почему глючит. Да я собственно с Потоков и начинал тему, до этого просто никогда не работал с ними! Но по ходу оказалось, что можно и без них обойтись, и код очень коротким получался ведь!? А что касается ProcessMessages , то я им и в других затяжных процедурах пользуюсь, чтоб избавиться от "Программа не отвечает"(или как там?) в шапке форм! А как по другому этого избежать? Вот недавно сравнительно узнал, что можно ProgressBar.Refresh делать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:01 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
дивлюсь я вам, мужики. Вместо того, чтобы доедать оливье и в телик пялиться, вы домашку школьнику, пересевшего с бейсика на паскаль, делаете. Да и еще с ним аргументированно спорить пытаетесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:11 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Док, Не знаю, как кто, я уже оливье с шубой объелся Хватит, надо калории немного потратить ) Пациент не совсем упоротый, шансы есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:14 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellic, У меня всё без ошибок работает. Ошибки делаешь ты... Это задача вообще на 10 - 20 минут в реализации. Может бы начал с чего нибудь полегче ???? НяшикЦиклы к слову вообще не нужны, уже есть ApplicationEvents Можно и так сделать ведь Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:28 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
makhaon, Я уже поправился на 8 кг... Тяжело ходить даже стало xD ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:30 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicизбавиться от "Программа не отвечает"(или как там?) в шапке форм! А как по другому этого избежать? Делать тяжелую работу в другом потоке. BellicВот недавно сравнительно узнал, что можно ProgressBar.Refresh делать! Не надо вызывать, если делать работу в другом потоке. Именно из-за того, что ты с помощью костылей пытаешься делать и работу и отрисовку интерфейса, у тебя и получается эффект, обратный Bellicкод очень коротким получался ведь!? Более того, ты вызовом принудительной отрисовки (ProgressBar.Refresh и подобного) замедляешь работу основного своего алгоритма, который ты называешь "циклом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:37 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Bellicкод очень коротким получался ведь!? Да, и еще. Мой код (с потоком) на 5 с половиной строк больше твоего потому, что я предусмотрел для пользователя возможность в любой момент корректно и сразу закрыть программу. Если уважение к пользователям не нужно - можно убрать оттуда некоторые проверки, кое-где Wait заменить на Sleep, работать по FreeOnTerminate=True, и еще много чего. Уверяю тебя, что код с потоком получится меньше, чем у тебя (хотя бы потому, что нет goto в основном алгоритме). И будет висеть при нажатии на крестик, пока не закончится "цикл", как ты любишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 19:46 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockBellic Freedoom , очень интересно получилось! Класс! (Нет явного цикла ожидания, доп.потока и TAG использован по совету парней!) Жаль только электроэнергии за нагрузку процессора в 100% и тормозов компьютера из-за этого. Если речь идёт об экономии электроэнергии на время обдумывания выбора варианта ответа пользователем, то никто не мешает глянуть на реализацию ShowModal в первоисточниках и переделать цикл Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 21:21 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Freedoomпеределать цикл Код: pascal 1. 2. 3. Это уже лучше, хотя и все равно мрак. И это не первоисточники, а такие же костыли и грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2018, 22:21 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, см реализацию ShowModal в vcl.forms.pas ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 01:37 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
FreedoomYuRock, см реализацию ShowModal в vcl.forms.pasЯ её смотрел уже раньше. Костыли и грабли. Такой подход иногда допустим, когда действительно надо быстро вставить костыль в готовую рабочую систему, и другого выхода нет, кроме как всё переделывать, что может быть не выгодно. Но заложить такое в основу библиотеки... Я когда первый раз наступил на это и увидел в чем проблема... Такого я от Борланда не ожидал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 02:26 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
YuRockТакого я от Борланда не ожидал. По моему они уже скатились, и сейчас выпускают что бы была активность для продаж ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 09:47 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Няшик, ты будешь удивлен, но Борланда уже почти 10 лет как не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 09:50 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
НяшикYuRockТакого я от Борланда не ожидал. По моему они уже скатились, и сейчас выпускают что бы была активность для продажКод ShowModal не менялся больше 20 лет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 11:44 |
|
||
|
Обработка нажатия трех кнопок в параллельном потоке
|
|||
|---|---|---|---|
|
#18+
Привет Сиквелцам! Не хочется никого отвлекать пустыми разговорами - для себя оценил вариант YuRock -ка, поэтому буду внедрять Поток в свою прогу! Единственное - хотелось бы увидеть полностью законченный вариант от Няшик -ка на Events! Кнопки у него на форме имеются, а счет - отсутствует! Няшик , допиши плизз...)) P.S. Прикрепляю полностью вариант проекта Няшик -ка для XE3 c двумя его реализациями - с массивами и без них, но в обоих случаях отсутствует цикл счета с выводом в MLabel: TLabel; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2018, 20:06 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041379]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
192ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
91ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 532ms |

| 0 / 0 |
