Технология программирования сложных расчетов
Хотелось бы обменятся опытом по следующему интересному вопросу.
Есть некоторый класс задач (поставленный какой-нибудь прикладной
наукой), входные и выходные данны четко определены, метод решения
также известен. Все что требуется - написать программу для расчета,
в которую можно ввести входные данные, выполнить расчет и вывести
результаты. В общем все просто, стандартно и банально до безобразия.
В принципе даже школьник осилит, если метод не особо замороченный.
Также договоримся, что программа пишется под Windows с использова-
нием доступных элементов графического интерфейса пользователя, пре-
доставляемых как самой ОС, так и средой разработки GUI-приложений.
А теперь нюансы... Метод решения может оказаться не особо сложным
для понимания, а вот с вычислительной точки зрения очень трудоемким.
Соответственно, если расчет "долгий", то окно программы "умирает" на
время вычислений, никак не откликаясь на воздействия пользователя.
Соответственно, хотелось бы чтобы программа расчета умела следующее:
1) Не "умирать" при выполнении длительных расчетов и быть "отзывчивой".
2) Предоставлять возможность корректно прерывать расчеты в любой мо-
мент по желанию пользователя, при этом культурно подчищая все хвосты:
освобождая выделенные блоки памяти, закрывая открытые файлы и прочее.
3) Предоставлять возможность следить за текущим состоянием выполняемых
расчетов. В простейшем случае - процент завершенности. В более сложных
случаях - подробная детализация внутреннего состояния решаемой задачи.
У меня, разумеется, за годы выработался свой шаблон для подобных программ,
который, разумеется, включает использование отдельных потоков (thread), но
там есть свои подводные камни и нюансы, вот о них и хотелось бы поговорить.
P.S. Про распараллеливание самого метода решения здесь говорить не будем,
это уже совсем отдельная тема... долгая, нудная, многотомная и бесконечная.
P.P.S. Да чуть не забыл... Все вышеперечисленные "удобства" ни в коим случае
не должны сколь-либо существенно увеличивать общее время решения задачи.
Кроме того, главный поток не должен захлёбываться от прорвы Windows message.
Ну, и, наконец, обойти все случаи, приводящие к dead-lock (взаимоблокировке).
Последний раз редактировалось Paul Kellerman; 14.01.2011 в 14:38.
|