C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Параллельные вычисления, Параллельные вычисления
finder007
Отправлено: 21.02.2007, 10:02


Ученик-кочегар

Группа: Участник
Сообщений: 7



Здравствуйте.

Подскажите, что лучше использовать для решения следующей задачи.

Есть приложение, отображающее состояния некоторого количества объектов. Время от времени происходит процесс вычисления этих состояний, он занимает достаточно большое время на которое приложение "умирает", а поскольку кроме как отображение состояний объектов приложение выполняет еще какие-то функции, хотелось бы во время длителных вычислений их использовать.

Каким инструментом лучше воспользоваться что-бы отделить вычисления от работы приложения, и еще что-бы можно было следить за состоянием процесса вычисления, все расчитано или еще все в процессе?
Arsa
Отправлено: 21.02.2007, 10:53


Дежурный стрелочник

Группа: Участник
Сообщений: 77



Потоки — эффективная вещь в таких случаях.
Tantos
Отправлено: 21.02.2007, 14:44


Станционный диспетчер

Группа: Участник
Сообщений: 108



Можно так же воспользоваться конструкцией:
CODE

Application->ProcessMessages();

cool.gif
ion
Отправлено: 22.02.2007, 12:07


Ученик-кочегар

Группа: Участник
Сообщений: 15



Что такое поток, или веренне два потока,-это это один поток занимает
определенный квант времени процессора, потом другой поток,
такую задачу потоками как мне кажется не решить, так как расчет( один поток) будет удлиняться на квант вторго потка, да и второй поток будет
работать за счет первого, не так быстро ,
на самом деле проц держит 1 поток, мы думаем что два и более,
это не так, тут можно сделать несколько вещей, преложить расчет на работу сервера, откуда получаем данные, преложить работу на другой комп свободный в плане загрузки,( локальная сеть, или глобальная)
выполнять расчеты, в период реального простоя процессора, командой на выполнение может быть уровень загруженности процессора, а командой на
прерывание сообщение с девайсов ввода, выполнение в ночное время, выполнение в обеденный перерыв, многие так и делают.
Ох и жрать охота..................


Konstantine
Отправлено: 22.02.2007, 12:39


Мастер участка

Группа: Модератор
Сообщений: 545



если вычислений немного или машина однопроцессорная, то пользуйтесь
CODE
Application->ProcessMessages();
как и предложил Tantos. этот метод приостанавливает текущую ыункцию и обрабатывает входящие окну сообщения (в том числе и перерисовки).
единственный момент — если запускаете с кнопки, то во избещании коллизий, кнопку перед вычислениями деактивируйте, а в конце вычислений активируйте
CODE
Button1->Enabled=true;
finder007
Отправлено: 26.02.2007, 09:04


Ученик-кочегар

Группа: Участник
Сообщений: 7



Большое спасибо за ответы.
Rius
Отправлено: 26.02.2007, 09:42


Мастер участка

Группа: Участник
Сообщений: 321



QUOTE (Arsa @ 21.02.2007, 13:53)
Потоки — эффективная вещь в таких случаях.

а использование ProcessMessages() — скрытые до поры до времени грабли.
такие вещи делаются именно через потоки.
Konstantine
Отправлено: 26.02.2007, 09:52


Мастер участка

Группа: Модератор
Сообщений: 545



если правильно делать и предотвращать возможные коллизии, то всё нормально работает, а потоки дольше настраивать и синхронизировать
Rius
Отправлено: 26.02.2007, 10:55


Мастер участка

Группа: Участник
Сообщений: 321



да, это если задача очень простая.
с другой стороны, в цикле длительного вычисления -
* при отсутствии ProcessMessages окно программы подвисает до его завершения;
* при вызове ProcessMessages в теле цикла — время выполнения заметно растягивается;
* если вызывать ProcessMessages не при каждом возможном случае, будет компромисс между скоростью выполнения и зависаниями, выражающийся в отвисании окна рывками.

в отдельном же потоке можно быстро произвести вычисления и вывести результат, без торможения gui

ion это не актуально, windows работает с сотнями потоков

Отредактировано Rius — 26.02.2007, 16:00

Вернуться в Вопросы программирования в C++Builder