finder007 |
Отправлено: 21.02.2007, 10:02 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 7
|
Здравствуйте.
Подскажите, что лучше использовать для решения следующей задачи.
Есть приложение, отображающее состояния некоторого количества объектов. Время от времени происходит процесс вычисления этих состояний, он занимает достаточно большое время на которое приложение "умирает", а поскольку кроме как отображение состояний объектов приложение выполняет еще какие-то функции, хотелось бы во время длителных вычислений их использовать.
Каким инструментом лучше воспользоваться что-бы отделить вычисления от работы приложения, и еще что-бы можно было следить за состоянием процесса вычисления, все расчитано или еще все в процессе? |
|
Arsa |
Отправлено: 21.02.2007, 10:53 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 77
|
Потоки — эффективная вещь в таких случаях. |
|
Tantos |
Отправлено: 21.02.2007, 14:44 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Можно так же воспользоваться конструкцией:
CODE |
Application->ProcessMessages();
|
|
|
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
|
|