Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Досрочный выход из программы, Досрочный выход из программы 
:(
    Опции темы
ViC1
Дата 28.2.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Добрый день! 

Имеется программа на Borland С, нажимаю на фоме кнопку и запускаю расчет. Расчет производится в функции нажатия на кнопку. Если я хочу остановить программу, то это можно сделать только из "Диспетчера задач". Виндоусовский крестик в правом верхнем углу не помагает. 

Как можно остановить программу во время вычислений не из "Диспетчера задач"? 

Спасибо
PM MAIL   Вверх
EnergoHokum
Дата 28.2.2008, 11:58 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Вынести сам расчёт в отдельный поток, отлавливать событие выхода из программы, корректно освобождать ресурсы потока, прибить его, выйти.
PM MAIL ICQ   Вверх
ViC1
Дата 28.2.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



В одном из циклов написал Application->ProcessMessages();
программа на закрывание не реагирует (виндуосовский крестик)

Прогу получилось закрыть, сделав кнопку которая вызывает exit(0);

Насколько это правильно?
Сильно ли от этого пострадает быстродействие?

Насколько это хуже, чем выносить вычисления в отдельный поток?

В книжке по Builder C++ 6 не нашел про CreateThread
PM MAIL   Вверх
EnergoHokum
Дата 28.2.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



У тебя сам алгоритм расчёта занимает мало "по коду", но долго выполняется? Память в этом расчёте выделяется динамически?
PM MAIL ICQ   Вверх
ViC1
Дата 28.2.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Расчет занимает большую часть алгоритма и выполняется долго.
Все основные массивы для расчета создаю динамически double* x = new double [размерность];

Подскажите, пожалуйста, примерный код, как это реализовать через CreateThread
(допустим, сам расчет будет a = b + c, который вичисляется в цикле)
PM MAIL   Вверх
ViC1
Дата 28.2.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Расчет занимает большую часть алгоритма и выполняется долго.
Все основные массивы для расчета создаю динамически double* x = new double [размерность];

Подскажите, пожалуйста, примерный код, как это реализовать через CreateThread
(допустим, сам расчет будет a = b + c, который вичисляется в цикле)
PM MAIL   Вверх
EnergoHokum
Дата 28.2.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Ну, не зная точно саму структуру алгоритма/расчёта мне трудно советовать что-либо определённое, нюансов может быть масса. Но вот как я себе это вижу:
Во первых, нужно будет предельно отделить сам расчёт (все его функции) от графинтерфейса. Т. е., если у тебя на "морде" программы есть поля ввода, которые задают какие-нить параметры расчёта, и поля вывода (туда уходит результат), а так-же управляющие органы (кнопки, чекбоксы, прочие ползунки), которые могут влиять на процесс расчёта -- ни в коем случае нельзя допускать их прямого "общения" с переменными алгоритма.
Все эти входные/выходные данные нужно "собрать в кучу" (структуру, например) и инициализировать перед запуском потока (потоков) вычисления.
Далее, вычисления идут, память выделяется, если поток грохнуть в произвольный момент времени (я рассматриваю потоки на чистом WinAPI), то с огромной вероятностью получим утечки памяти. Значит, нужно в ключевых точках потока (где они будут -- решать тебе, как автору smile) расставить проверку некоего события (функция CreateEvent его создаёт, функция WaitForSingleObject позволяет проверить его состояние, SetEvent, ResetEvent -- управление, CloseHandle -- уничтожение). Если обнаруживаем, что событие взведено (в основной программе нажали на "выход") -- освобождаем память, выделенную в потоке на данный момент, и завершаем поток.
Теперь основная программа (launcher, так сказать): структуру данных проинициализировали, отдаём указатель на неё функции (функциям) создания потока (CreateThread). Если в процессе работы входные данные изменились, можно заранее создать ещё одно событие "перечитать данные". Устанавливаем его, а поток, когда посчитает нужным, перечитает структуру. Завершаем поток (потоки) вычислений: устанавливаем событие "хватит работать", и функцией WaitForSingleObject (WaitForMultipleObjects, если потоков несколько) ждём HANDLE этого потока (этих потоков), который был возвращён функцией CreateThread, и который (которые) мы заблаговременно сохранили. Как только дождались все HANDLE -- значит, потоки отработали, ресурсы почищены (ну, если ты не пропустил сам, бывает smile), можно завершаться.
Вот, приблизительно такой у меня взгляд на проблему долгих (и контролируемых пользователем) вычислений в программах.
PM MAIL ICQ   Вверх
ViC1
Дата 28.2.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Спасибо
PM MAIL   Вверх
xvr
Дата 28.2.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ViC1 @ 28.2.2008,  13:16)
В одном из циклов написал Application->ProcessMessages();
программа на закрывание не реагирует (виндуосовский крестик)

Что бы программа отреагировала надо выйти из всех циклов и вернуться из обработчика события нажатия кнопки (где у тебя и происходят вычисления)
Цитата

Прогу получилось закрыть, сделав кнопку которая вызывает exit(0);
То же вариант.
Цитата

Насколько это правильно?
Совсем не правильно, но если единственное, что нужно - это прибить задачу, то вполне сойдет.
Цитата

Сильно ли от этого пострадает быстродействие?
Совсем не пострадает
Если не хочется создавать потоки, то можно просто после вызова Application->ProcessMessages(); проверять, не пора ли заканчивать (по специальному флагу, который можно взводить по нажатию кнопки или по event'у OnCloseQuery) и прерывать вычисления (можно с помощью throw)
Цитата

Насколько это хуже, чем выносить вычисления в отдельный поток?
Потоки требуют бережного отношения к себе  smile 

Цитата

В книжке по Builder C++ 6 не нашел про CreateThread
Надо искать TThread

PM MAIL   Вверх
EnergoHokum
Дата 28.2.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Ну, в связи с уверенным наступлением многоголовых процессоров, я-бы посоветовал присмотреться к потокам...
PM MAIL ICQ   Вверх
ViC1
Дата 28.2.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.11.2007

Репутация: нет
Всего: нет



Спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.