![]() |
|
|
![]()
|
|
| chaoss |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2008 Репутация: нет Всего: нет |
Доброго времени суток!
Я занимаюсь программированием одной математической модели физического процесса. Пишу на VC++ .NET 2003 с использованием MFC. Столкнулся со следующей проблемой: У меня есть цикл расчета, он запускается по нажатию на клавишу. Цикл очень большой, примерно такой:
Полный расчет цикла занимает минут от 5 и до бесконечности, в зависимости от параметров системы. Проблема в том, что при прямой вот такой записи данный цикл съедает все ресурсы и иногда дает сбои. То есть, я не могу нормально переключиться в другую программу, оставив расчет в фоновом режиме. Цикл съедает все ресурсы и не обновляет окно до завершения расчета. Иногда просиходит просто ошибка, цикл прекращается тогда, когда он должен еще работать и работать. Сделал пару переключений между программами и цикл сам завершился. Ну и другие подобные ошибки возникают из-за того, что данный цикл вешает всю программу и не хочет делиться ресурсами. Что я сделал? В первом цикле после while я вставил дополнительный код:
Программа сразу стала работать веселее, лучше откликается на мои действия во время расчета, может работать в фоновом режиме. Но лишь до определенного предела. Если я еще увеличиваю длительность циклов, то и этого мало. Самое очевидное и тупое, что я смог придумать - вставить данный код после входа в каждый цикл. Тогда подвисания и подобные проблемы случаются еще реже. Но мне кажется, что это не выход, нельзя же после каждого for такой код вставлять. А что делать, что посоветуете? Еще раз повторю: мне надо, чтобы программа делала расчет в фоновом режиме, не давала сбоев при этом, я мог спокойно переключаться между ней и другими программами, чтобы у нее окошко обновлялось еще до завершения всего цикла. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
во первых оптимизировать алгоритм расчета 4 вложенных цикла, это в худшем случае сложность O^4. во вторых, если нельзя уменьшить алгоритмическую сложность, можно это вынести в отдельный поток. в третьих, неплохо было-бы написать эту ф-ю так, что-бы она вычислялась по частям, тоесть, что-бы можно было аккуратно прервать ее работу зы а код, что, очень секретный? |
|||
|
||||
| chaoss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2008 Репутация: нет Всего: нет |
[QUOTE=Lazin,29.4.2008, 18:15]
Нет, не секретный, просто вряд ли понятный. Чтобы были понятны причины изложу не в виде кода, а просто опишу задачу: Первый цикл while - итерационный, он работает пока приближенное решение не сойдется к точному. Если Вы с вычислительной математикой знакомы, то у меня используется один из методов итерационного нахождения решения, когда от некоторого начального приближения за N шагов делается приближение к точному решению. Следующий внутренний цикл - цикл по количеству городов. В моей модели я оперирую с несколькими городами, которые расположены на двухмерной географической карте. Следующий внутренний цикл уже описывает то, что расчитывается для каждого отдельно взятого города. А именно каждый город имеет вокруг себя некоторую силу, которая распределена на территории и задана в виде двухмерного массива. Чтобы вычислить значение этой силы, я сначала "прохожу" по территории по горизонтали, а потом по вертикали. Отсюда еще два внутренних цикла. Все это нужно для нахождения некоторых коэффициентов, а затем получения решения. Так что, увы, без такого количества вложенных циклов не обойтись. P.S. На самом деле их еще больше, все это расчитывается не статично, как я выше описал, а по времени. То есть то, что описано выше - это один момент времени лишь. А затем происходит некоторое небольшое изменение параметров и все считается заново, так что еще один самый большой цикл получается. А надо всего лишь, чтобы в фоновом режиме корректно работала программа, а там хоть пол дня пусть считает. У меня не написано распараллеливание для двухядерного процессора, поэтому программа кушает лишь 50% процессорных ресурсов, а остальное мне остается для другой работы. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
Тогда нужно вынести в другой поток.
создать его можно ф-й ::beginthreadex (с MFC не знаком, но там наверняка есть класс - поток и он наверняка называется СThread после того как вычисления закончены, посылай основному потоку сообщение, вот и все =) |
|||
|
||||
| chaoss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2008 Репутация: нет Всего: нет |
Ясно. Вообще я раньше с потоками не работал, не программировал. Но попробую изучить ради такого дела.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |