Если Вы имеете одну таблицу и хотите получить данные из другой таблицы, обычно это находится в ситуации 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|
...
Вы полностью ограничены квадроциклами фиксированного размера? Идеальное решение - обрезать последний квад до нужного размера.
Если вы ограничены, вы можете сделать пару вещей. Если вы рисуете пунктирные линии, вы можете изменять расстояние между штрихами, чтобы убедиться, что у вас никогда не будет частичных четырехугольников на конечных точках. Это может визуально отвлекать, так как расстояние будет регулироваться в зависимости от длины сегмента.
редактировать:
А, картинка помогает. Я предполагаю, что, поскольку это на iPhone, вы получаете серию точек, из которых линии между ними дают приемлемую кривую. Если это так, использование примитивов сплайнов / кривых, вероятно, излишне. Я бы, вероятно, подошел к рисованию линий, как показано, просто путем рисования четырехугольников в каждой точке данных, которая находится на заданном расстоянии от последней точки данных. идентичные URL-адреса в карте сайта (которые запрещено в готовом виде Когда вы станете более конкретным, может потребоваться погрузиться в семафоры или сигналы, которые часто зависят от ОС. Уровень абстракции может решить эту проблему.
Если вы делаете что-то полезное (например, обрабатываете большой объем данных), то 100% загрузка процессора просто означает, что процессор используется наиболее эффективным образом. Вы можете рассчитывать на то, что операционная система уступит место другим и, возможно, более приоритетным задачам.
Использование такой функции, как сон, снизит загрузку процессора, но ваше приложение будет работать медленнее. Потребуется найти компромисс между приемлемой производительностью и загрузкой процессора. Максимальная скорость выполнения будет определяться параметром сна, а не скоростью процессора. Кроме того, если проблема связана с питанием (например, время работы от батареи), то для этого потребуется, чтобы ЦП пробудился (конец периода сна), не выполняя никаких действий; т.е.
У вас есть два варианта: опрос и какое-то уведомление о событии.
Опрос проще всего запрограммировать - в основном ваш поток ненадолго спит при каждом прохождении цикла . Это освобождает процессор для выполнения других задач. Обратной стороной является то, что в вашем коде «проверки наличия материала» будет задержка - поэтому, если вы спите в течение секунды, может пройти до секунды, прежде чем ваш код обнаружит условие. Ваш код здесь будет легко перенести.
Другой вариант - дождаться условного POSIX, события Windows или чего-то подобного. Мало того, что этот код будет изменен, но и тогда «материал, который вы проверяете» должен будет активировать флаг, чтобы сказать, что это сделано. Это был бы немного менее переносимый код, хотя, вероятно, существуют библиотеки для абстрагирования от платформы. Но ты'
Что именно вы проверяете?
Если вы проверяете что-то непостоянное, изменяемое оборудованием или другим процессом, просто вызовите sleep
в своем цикле.
Если вы ожидаете дескриптора файла или дескриптора сетевого сокета, вы захотите использовать в своем цикле select
или poll
, чтобы дождаться, пока дескриптор подготовит данные для использования. .
В Windows вы можете использовать Sleep (int миллисекунды), определенный в windows.h.
У вас есть несколько вариантов:
Вариант № 2 может быть непростым для нейтральной платформы / ОС. Лучше всего запустить процесс и изменить его приоритет в среде выполнения.
Если я правильно догадываюсь (я не знаю об этом), эквивалент App.ProcessMessages выполняет блокировку ввода-вывода. И поскольку я не знаю ни одной реализации C в многозадачной ОС, которая использует опрос, любой стандартный ввод-вывод C должен быть безопасным.
Если я правильно понял, вы сказали в комментариях, что 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);