link5180 link5181 link5182 link5183 link5184 link5185 link5186 link5187 link5188 link5189 link5190 link5191 link5192 link5193 link5194 link5195 link5196 link5197 link5198 link5199 link5200 link5201 link5202 link5203 link5204 link5205 link5206 link5207 link5208 link5209 link5210 link5211 link5212 link5213 link5214 link5215 link5216 link5217 link5218 link5219 link5220 link5221 link5222 link5223 link5224 link5225 link5226 link5227 link5228 link5229 link5230 link5231 link5232 link5233 link5234 link5235 link5236 link5237 link5238 link5239 link5240 link5241 link5242 link5243 link5244 link5245 link5246 link5247 link5248 link5249 link5250 link5251 link5252 link5253 link5254 link5255 link5256 link5257 link5258 link5259 link5260 link5261 link5262 link5263 link5264 link5265 link5266 link5267 link5268 link5269 link5270 link5271 link5272 link5273 link5274 link5275 link5276 link5277 link5278 link5279 link5280 link5281 link5282 link5283 link5284 link5285 link5286 link5287 link5288 link5289 link5290 link5291 link5292 link5293 link5294 link5295 link5296 link5297 link5298 link5299 link5300 link5301 link5302 link5303 link5304 link5305 link5306 link5307 link5308 link5309 link5310 link5311 link5312 link5313 link5314 link5315 link5316 link5317 link5318 link5319
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