1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
|
|
1 | |
Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?03.08.2017, 13:10. Показов 2008. Ответов 57
Метки нет (Все метки)
Здравствуйте! Профи подскажите, можно ли и как запустить в программе написанной на Delphi 7 12 разных циклов одновременно, и чтобы получать из них результаты и собрать эти результаты в один?
0
|
03.08.2017, 13:10 | |
Ответы с готовыми решениями:
57
Как запустить метод класса одновременно в разных потоках? Права администратора в программе написанной на delphi xe3 Можно ли создать тест в программе My Test Student и запустить этот тест через Delphi? Можно ли модули, написанные на Python, использовать в программе, которая пишется на Delphi? И если можно, то как? |
06.08.2017, 13:46 | 42 |
потому что пока ваша программа работает, никакие переменные в ней никаким магическим образом не поменяются
поэтому успокойтесь. не нужно бесконечных циклов. отпустите программу обрабатывать вашу мыш и кноподоску. когда поток завершился, он придет в OnTerm. Там и проверяйте. Если количество завершенных=кол-ву запущенных, выводите сумму на экран
0
|
Айлурофил
|
|
06.08.2017, 13:56 | 43 |
А конкретней можно?
Если логика программы подразумевает: 1. Запустить потоки. 2. Дождаться окончания их работы. 3. Получить результат работы. 4. Делать что-то с этим результатом дальше. 4а. На экране мне никаких сумм не нужно. То как должен выглядеть код? Добавлено через 5 минут Но потоки-то тоже работают. И в предыдущем коде магия таки происходит.
0
|
06.08.2017, 15:19 | 46 | |||||
как-то подзадолбало уже.
я в первом же ответе дал ссылку на пример, который показывает, как разделить работу по потокам, при этом контролируя кол-во одновременно запущенных вот вам второй раз запустить 1000 потоков 10 одновременно при завершении каждого проверять а) нужны ли еще потоки б) все ли потоки завершились Кликните здесь для просмотра всего текста
0
|
Айлурофил
|
|
06.08.2017, 21:54 | 47 |
(Со вздохом) Хорошо, если после получения итога, как в Вашем примере, этот итог не нужно выводить на экран, а нужно провести с ним сложные вычисления, возможно, с новыми созданиями потоков (как это будет в реале, а не в учебном коде, например при анализе позиций шахматной партии), Вы это тоже продолжите делать в процедуре ThreadTerminated?
0
|
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
|
|
07.08.2017, 02:04 | 48 |
А я давно уже спрашивал
А что такое "общее значение среди них"? Теперь спрашиваю а что значит "Если не объединять их"?
0
|
07.08.2017, 07:30 | 49 |
объясните, в чем разница - вывести результат в мемо и
и даже
Если вы посмотрите на код, то увидите как раз запуск новых потоков.
результат все равно будет готов только когда закончится последний поток раньше этого момента ваша программа может только а) "зависнуть", не реагируя на внешние раздражители б) работать как обычно с мышью и клавиатурой (ну, если есть хоть одно ядро свободное от массы потоков) когда вы загружаете страницу в браузере, он производит скачивание 10-20 файлов, и до черта всяких "сложных вычислений" и при этом вы все еще можете просто прибить страницу и не ждать, при этом все остальные как работали так и работают! хотя они тоже могли сделать цикл "пока все не загрузится, пусть пользователь пойдет почитает книгу"
0
|
Айлурофил
|
|
07.08.2017, 08:51 | 50 |
Понятно, каждый из нас рассуждает, имея в виду свои категории задач.
Я рассуждаю о потоках, имея в виду, в основном, категории вычислительных задач прямой логики, когда длинные вычисления разбиваются на потоки с целью уменьшения времени (типа расчета шахматных позиций, или математических вычислений), и в это время можно, конечно, пощёлкать мышкой или набрать что-то на клавиатуре, но - зачем? И в этом случае мой подход вполне работает. У Вас рассуждения о задачах параллельной логики, где будет работать именно Ваш подход. На этом и остановимся.
0
|
07.08.2017, 11:01 | 51 |
если бы вам было все равно, висит программа или нет, вы не лепили бы Application.ProcessMessages, которая вам нужна именно для обновления UI и работы с вводом. а на деле имеет спецэффекты
главный цикл программы Application.Run как раз и представляет собой бесконечный цикл с обработкой Application.ProcessMessages. Не надо его дублировать, запуская второе кольцо в обработчике, из которого опять можно попасть в обработчик и т.д.
0
|
Житель Земли
|
||||||
07.08.2017, 11:03 | 52 | |||||
Massaraksh7, вникни. обрати такде внимание на очередность завершения работы потоков. она всегда разная
Кликните здесь для просмотра всего текста
0
|
Айлурофил
|
|
07.08.2017, 11:30 | 53 |
krapotkin, я вовсе не настаиваю на том, что это должен быть цикл с ProcessMessages. Логичней, конечно, применить WaitForSingleObject, через семафоры.
Добавлено через 2 минуты Но я не хочу их здесь производить. Я их хочу производить в основной ветке, где у меня уже настроены все локальные переменные.
0
|
Житель Земли
|
|
07.08.2017, 11:50 | 56 |
потоки именно для того и предназначены, чтобы не ждать, пока выполнится задача, а делать другие действия (с точки зрения приложения, выполнять основной поток без "зависаний"). а у тебя как: запустил потоки и ждешь пока они завершатся, постоянно проверяя их завершение!. вот это и есть глупо. их не надо проверять постоянно, как школьника, сделал ли он уроки. потоки сами отсалютуют о завершении, если ты их об этом попросишь.
во-первых, что такое "прямая логика"? во-вторых, любую логику можно запрограммировать по-разному
0
|
Айлурофил
|
|
07.08.2017, 12:10 | 57 |
Простой пример: запусти любую шахматную программу и проверь: какие действия ты можешь совершить, пока она думает?
Или напиши программу расчета n! для больших n, и определи: какие "другие действия" нужно выполнять пока она считает?
0
|
Житель Земли
|
|
07.08.2017, 12:32 | 58 |
если эта программа создает впечатление "зависшей", пока она думает, то это проблемы квалификации программиста, писавшего ее, не стоит наследовать этот пример
хотя бы свернуть "думающую" шахматную программу
0
|
07.08.2017, 12:32 | |
07.08.2017, 12:32 | |
Помогаю со студенческими работами здесь
58
Как можно создать последовательность разных кадров (изображений) в одном слое в программе KoolMoves Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi Как подключить графику к написанной программе? Как подключить код на С к программе написанной на VB Можно ли в разных lock() одновременно использовать один и тот же объект синхронизации Как взломать программу написанной Delphi Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |