C Основной цикл без 100% CPU

Если Вы имеете одну таблицу и хотите получить данные из другой таблицы, обычно это находится в ситуации has_many отношение. Например, мы имеем @people (Person модель), и каждый человек has_many адреса (Address модель). В тех случаях лучшая вещь сделать является этим

# Controller
@people = Person.find(:all, :include => :addresses)
...

# View
@people.each do |p|
  p.addresses.each do |address|
    ...

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

# Controller
@people = Person.find(:all)
@people.each do |p|
  # attach loaded data to the person object in controller
  p.addresses = Address.load_from_somewhere_by_name(p.name)
...

Этот путь код представления остается чистым, как это:

# View
@people.each do |p|
  p.addresses.each do |address|
    ...
19
задан pwseo 3 August 2009 в 14:10
поделиться

10 ответов

Вы полностью ограничены квадроциклами фиксированного размера? Идеальное решение - обрезать последний квад до нужного размера.

Если вы ограничены, вы можете сделать пару вещей. Если вы рисуете пунктирные линии, вы можете изменять расстояние между штрихами, чтобы убедиться, что у вас никогда не будет частичных четырехугольников на конечных точках. Это может визуально отвлекать, так как расстояние будет регулироваться в зависимости от длины сегмента.

редактировать:

А, картинка помогает. Я предполагаю, что, поскольку это на iPhone, вы получаете серию точек, из которых линии между ними дают приемлемую кривую. Если это так, использование примитивов сплайнов / кривых, вероятно, излишне. Я бы, вероятно, подошел к рисованию линий, как показано, просто путем рисования четырехугольников в каждой точке данных, которая находится на заданном расстоянии от последней точки данных. идентичные URL-адреса в карте сайта (которые запрещено в готовом виде Когда вы станете более конкретным, может потребоваться погрузиться в семафоры или сигналы, которые часто зависят от ОС. Уровень абстракции может решить эту проблему.

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

Использование такой функции, как сон, снизит загрузку процессора, но ваше приложение будет работать медленнее. Потребуется найти компромисс между приемлемой производительностью и загрузкой процессора. Максимальная скорость выполнения будет определяться параметром сна, а не скоростью процессора. Кроме того, если проблема связана с питанием (например, время работы от батареи), то для этого потребуется, чтобы ЦП пробудился (конец периода сна), не выполняя никаких действий; т.е.

16
ответ дан 30 November 2019 в 03:20
поделиться

У вас есть два варианта: опрос и какое-то уведомление о событии.

Опрос проще всего запрограммировать - в основном ваш поток ненадолго спит при каждом прохождении цикла . Это освобождает процессор для выполнения других задач. Обратной стороной является то, что в вашем коде «проверки наличия материала» будет задержка - поэтому, если вы спите в течение секунды, может пройти до секунды, прежде чем ваш код обнаружит условие. Ваш код здесь будет легко перенести.

Другой вариант - дождаться условного POSIX, события Windows или чего-то подобного. Мало того, что этот код будет изменен, но и тогда «материал, который вы проверяете» должен будет активировать флаг, чтобы сказать, что это сделано. Это был бы немного менее переносимый код, хотя, вероятно, существуют библиотеки для абстрагирования от платформы. Но ты'

6
ответ дан 30 November 2019 в 03:20
поделиться

Используйте yield ().

0
ответ дан 30 November 2019 в 03:20
поделиться

Что именно вы проверяете?

Если вы проверяете что-то непостоянное, изменяемое оборудованием или другим процессом, просто вызовите sleep в своем цикле.

Если вы ожидаете дескриптора файла или дескриптора сетевого сокета, вы захотите использовать в своем цикле select или poll , чтобы дождаться, пока дескриптор подготовит данные для использования. .

3
ответ дан 30 November 2019 в 03:20
поделиться

В Windows вы можете использовать Sleep (int миллисекунды), определенный в windows.h.

0
ответ дан 30 November 2019 в 03:20
поделиться

используйте

Sleep (int миллисекунды)

1
ответ дан 30 November 2019 в 03:20
поделиться

У вас есть несколько вариантов:

  1. Используйте sleep (), чтобы заставить процесс периодически приостанавливаться и разрешать другому процессу использовать CPU.
  2. Запускать с более низким уровнем приоритета - что приведет к ОС, чтобы назначить меньше процессорного времени
  3. Используйте мьютекс или другой объект синхронизации, чтобы определить, когда работа доступна - что не позволит процессу потреблять процессорное время, если он не выполняет свою работу
  4. Если вы выполняете работу быстрее, чем вы может обработать его - вам все равно может потребоваться какая-то модель сна / приоритета, чтобы избежать полного использования ЦП.

Вариант № 2 может быть непростым для нейтральной платформы / ОС. Лучше всего запустить процесс и изменить его приоритет в среде выполнения.

11
ответ дан 30 November 2019 в 03:20
поделиться

Если я правильно догадываюсь (я не знаю об этом), эквивалент App.ProcessMessages выполняет блокировку ввода-вывода. И поскольку я не знаю ни одной реализации C в многозадачной ОС, которая использует опрос, любой стандартный ввод-вывод C должен быть безопасным.

0
ответ дан 30 November 2019 в 03:20
поделиться

Если я правильно понял, вы сказали в комментариях, что DONE можно изменить из других потоков. В таком случае условные переменные имеют смысл. С pthreads можно было бы сделать:

В потоке, который ожидает:

pthread_mutex_lock(&mutex);
while (!DONE) {
     pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);

В других потоках, когда DONE изменяется:

pthread_mutex_lock(&mutex);
DONE = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
2
ответ дан 30 November 2019 в 03:20
поделиться

Спящий режим (0); достаточно

0
ответ дан 30 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: