![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
Добрый день!
Имеется программа на Borland С, нажимаю на фоме кнопку и запускаю расчет. Расчет производится в функции нажатия на кнопку. Если я хочу остановить программу, то это можно сделать только из "Диспетчера задач". Виндоусовский крестик в правом верхнем углу не помагает. Как можно остановить программу во время вычислений не из "Диспетчера задач"? Спасибо |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Вынести сам расчёт в отдельный поток, отлавливать событие выхода из программы, корректно освобождать ресурсы потока, прибить его, выйти.
|
|||
|
||||
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
В одном из циклов написал Application->ProcessMessages();
программа на закрывание не реагирует (виндуосовский крестик) Прогу получилось закрыть, сделав кнопку которая вызывает exit(0); Насколько это правильно? Сильно ли от этого пострадает быстродействие? Насколько это хуже, чем выносить вычисления в отдельный поток? В книжке по Builder C++ 6 не нашел про CreateThread |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
У тебя сам алгоритм расчёта занимает мало "по коду", но долго выполняется? Память в этом расчёте выделяется динамически?
|
|||
|
||||
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
Расчет занимает большую часть алгоритма и выполняется долго.
Все основные массивы для расчета создаю динамически double* x = new double [размерность]; Подскажите, пожалуйста, примерный код, как это реализовать через CreateThread (допустим, сам расчет будет a = b + c, который вичисляется в цикле) |
|||
|
||||
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
Расчет занимает большую часть алгоритма и выполняется долго.
Все основные массивы для расчета создаю динамически double* x = new double [размерность]; Подскажите, пожалуйста, примерный код, как это реализовать через CreateThread (допустим, сам расчет будет a = b + c, который вичисляется в цикле) |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну, не зная точно саму структуру алгоритма/расчёта мне трудно советовать что-либо определённое, нюансов может быть масса. Но вот как я себе это вижу:
Во первых, нужно будет предельно отделить сам расчёт (все его функции) от графинтерфейса. Т. е., если у тебя на "морде" программы есть поля ввода, которые задают какие-нить параметры расчёта, и поля вывода (туда уходит результат), а так-же управляющие органы (кнопки, чекбоксы, прочие ползунки), которые могут влиять на процесс расчёта -- ни в коем случае нельзя допускать их прямого "общения" с переменными алгоритма. Все эти входные/выходные данные нужно "собрать в кучу" (структуру, например) и инициализировать перед запуском потока (потоков) вычисления. Далее, вычисления идут, память выделяется, если поток грохнуть в произвольный момент времени (я рассматриваю потоки на чистом WinAPI), то с огромной вероятностью получим утечки памяти. Значит, нужно в ключевых точках потока (где они будут -- решать тебе, как автору Теперь основная программа (launcher, так сказать): структуру данных проинициализировали, отдаём указатель на неё функции (функциям) создания потока (CreateThread). Если в процессе работы входные данные изменились, можно заранее создать ещё одно событие "перечитать данные". Устанавливаем его, а поток, когда посчитает нужным, перечитает структуру. Завершаем поток (потоки) вычислений: устанавливаем событие "хватит работать", и функцией WaitForSingleObject (WaitForMultipleObjects, если потоков несколько) ждём HANDLE этого потока (этих потоков), который был возвращён функцией CreateThread, и который (которые) мы заблаговременно сохранили. Как только дождались все HANDLE -- значит, потоки отработали, ресурсы почищены (ну, если ты не пропустил сам, бывает Вот, приблизительно такой у меня взгляд на проблему долгих (и контролируемых пользователем) вычислений в программах. |
|||
|
||||
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
Спасибо
|
|||
|
||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Что бы программа отреагировала надо выйти из всех циклов и вернуться из обработчика события нажатия кнопки (где у тебя и происходят вычисления)
Если не хочется создавать потоки, то можно просто после вызова Application->ProcessMessages(); проверять, не пора ли заканчивать (по специальному флагу, который можно взводить по нажатию кнопки или по event'у OnCloseQuery) и прерывать вычисления (можно с помощью throw)
|
||||||||||||
|
|||||||||||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну, в связи с уверенным наступлением многоголовых процессоров, я-бы посоветовал присмотреться к потокам...
|
|||
|
||||
| ViC1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 6.11.2007 Репутация: нет Всего: нет |
Спасибо
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |