|
|
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Не програмистъ. Сильно прошу не бить (если только чуть). Кратко: Не могу разобраться как получить сообщение от SendMessage; Код почти полная копипаста: Отправитель: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Получатель: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И получатель никак не реагирует, ничего не меняет, вообще не входит в данную процедуру. Код: pascal 1. Работает корректно и находит нужное окно. Например команды Код: pascal 1. 2. 3. Вполне себе успешно перемещают нужное окно получателя или кликают по нему. Если чуть подробнее, может подскажите более корректное решение: Есть программа (оболочка), которая запускает множество расчетных одинаковых подпрограмм (~100), но так сразу 100 положит любой компьютер, запускать надо по "N" штук, потому надо отслеживать сколько программ работает в текущий момент и запускать новые по мере закрытия старых, потому завершившие работы программы посылают сообщение с идентификатором (который получили при запуске) о окончании работы и закрываются. С передачей сообщений никогда ранее дела не имел, потому - темный лес. Можно, конечно, отслеживать количество запущенных программ, но это неудобно в случае если запустить расчетную программу вручную (что тоже бывает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 11:33 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
почему не потоки а процессы? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 11:35 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Андрей Игоревич, Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 11:43 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийпочему не потоки а процессы? Возможно некорректно понял вопрос, но в основной программе естественно поток, который висит и последовательно запускает расчетные программы и отслеживает (будет отслеживать) их закрытие. goldmi45Андрей Игоревич, Код: pascal 1. Ааа...ааа... 3 часа сидел и тупил, вот как я мог прозевать, ведь вроде проверял, всё смотрел.... Всё, работает спасибо. Вот блин тупняк... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 12:35 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
SendMessage излишнее тут (и негибкое), если надо сообщать просто об окончании. Запускай процессы через CreateProcess, проверяй код завершения Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Выдрано из рабочей функции, но могут быть артефакты вырезания лишнего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 14:34 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Василий 2SendMessage излишнее тут (и негибкое), если надо сообщать просто об окончании. Запускай процессы через CreateProcess, проверяй код завершения Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Выдрано из рабочей функции, но могут быть артефакты вырезания лишнего Однако не очень простая функция :). Но интересная. Раз уж первый вопрос решился столь банально, не подскажете, как можно принудительно закрыть программы запущенные исключительно данной родительской программой (ну допустим запущенно две программы одновременно или вручную запущенна расчетная программа) у CreateProcess параметров какое-то безумное количество,способна ли она на такое? Смысл - сделать кнопку в родительской программе "Остановить расчет": процесс запуска новых модулей остановить легко, но вот сами модули закрыть сложнее (не закрыв лишнего), стоит понимать, что средний расчет в одном расчетном модуле идет 4-6 часов (а весть расчет может идти около недели). Впихивать в расчетные модули что-то для прерывания крайне не хочется, к этому модулю достаточно суровые требования по коду и разрабатывается он не мной, обработкой параметров при запуске и сообщением при окончании хотелось бы ограничится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2019, 23:18 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Конечно, посмотри внимательнее, у меня есть закрытие процесса по таймеру ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:19 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичРаз уж первый вопрос решился столь банально, не подскажете, как можно принудительно закрыть программы запущенные исключительно данной родительской программой (ну допустим запущенно две программы одновременно или вручную запущенна расчетная программа) у CreateProcess параметров какое-то безумное количество,способна ли она на такое? Смысл - сделать кнопку в родительской программе "Остановить расчет": процесс запуска новых модулей остановить легко, но вот сами модули закрыть сложнее (не закрыв лишнего), стоит понимать, что средний расчет в одном расчетном модуле идет 4-6 часов (а весть расчет может идти около недели). Впихивать в расчетные модули что-то для прерывания крайне не хочется, к этому модулю достаточно суровые требования по коду и разрабатывается он не мной, обработкой параметров при запуске и сообщением при окончании хотелось бы ограничится. TerminateProcess() должен помочь. Хэндл процесса у вас уже есть из кода выше, разве что с правами могут возникнуть трудности, но, по-идее, не должны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:26 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Василий 2Конечно, посмотри внимательнее, у меня есть закрытие процесса по таймеру Код: pascal 1. 2. Это вот жесть, с точки зрения читаемости кода, ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:28 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Василий 2Конечно, посмотри внимательнее, у меня есть закрытие процесса по таймеру Ага, спасибо. Всё отлично работает, открывает, закрывает, на удивление... Из любопытства, понимаю что не про Делфи, но вдруг знаете чисто теоретически может ли Handle у программ повторятся? Ну например запомнил я все Handle всех запущенных программ, пользователь позакрывал часть руками, потом понаоткрывал новых всяких разных, а затем нажал "остановить расчет" - который убивает все процессы с запомненными Handle и дополнительно убил и ни в чем не повинные процессы? Надо ли такое отслеживать или шанс подобного пренебрежительно мал? alekcvp TerminateProcess() должен помочь. Хэндл процесса у вас уже есть из кода выше, разве что с правами могут возникнуть трудности, но, по-идее, не должны. Отлично работает, спасибо. Про права, если у пользователя нет прав админа будет ли работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 14:41 |
|
||
|
Как корректно получить сообщение от SendMessage
|
|||
|---|---|---|---|
|
#18+
Андрей ИгоревичИз любопытства, понимаю что не про Делфи, но вдруг знаете чисто теоретически может ли Handle у программ повторятся? Ну например запомнил я все Handle всех запущенных программ, пользователь позакрывал часть руками, потом понаоткрывал новых всяких разных, а затем нажал "остановить расчет" - который убивает все процессы с запомненными Handle и дополнительно убил и ни в чем не повинные процессы? Надо ли такое отслеживать или шанс подобного пренебрежительно мал? Может, но: When a process terminates, its kernel object is not destroyed until all processes that have open handles to the process have released those handles.Т.е. пока все, у кого открыт этот процесс, не сделают CloseHandle() или не завершат работу - он будет валидным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 14:47 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39831026&tid=2039320]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 404ms |

| 0 / 0 |
