2015-05-14 7 views
2

У меня есть TList, который 'детали обрабатываются многими for -loops. Иногда мне нужно обменивать элементы в списке, чтобы изменить порядок визуального представления списка (в StringGrid).Как обменивать элементы TList во время цикла

Как мне обменять эти предметы?

Мои предварительные мысли:

  • Во время для цикла я думаю, что не нужно поменять местами пункты.
  • Если я делаю обмен в событии таймера OnTimer, установив интервал таймеров на очень короткий интервал (например, 1 миллисекунду), тогда я думаю, что for-loop будет иметь только аннулирование этой миллисекунды.

Будет ли это работать? Или есть лучшие альтернативы?

+0

Мы не сможем понять ваш вопрос, как указано. Пожалуйста, развернитесь. Скорее всего, это более подробное описание вашей проблемы и сокращенный код. –

+0

Когда вы говорите «Мне иногда нужно обмениваться товарами», было бы неплохо, если бы вы могли лучше объяснить, почему вы это делаете. Что вы получаете от этого? Нужно ли изменять порядок этих элементов, потому что обработка одного элемента может зависеть от другого элемента, который уже обрабатывается раньше? Нужно ли, чтобы весь элемент обрабатывался в каждом из логов или некоторые из них могли быть пропущены, что могло произойти, если вы перемещаете некоторые элементы, чтобы их новое местоположение находилось до текущей точки петли (элемент никогда не будет обработан, потому что он будет искажен как уже обрабатывается)? – SilverWarior

ответ

2

Пока вы не уверены, что количество элементов в TList не изменится, обмен предметами отлично в течение цикла. Обратите внимание, что в зависимости от индекса элементов, которые должны быть обменены, некоторые элементы не могут быть обработаны или могут быть обработаны дважды.

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

Таким образом, решение вашей проблемы может быть:

  • обмена деталь в пределах для цикла,
  • использовать раствор потоковый, чтобы иметь возможность делать две разных вещи Simultaniously в одном списке (это может потребоваться некоторое изучение потоков),
  • ждать, пока для цикла не выполняется, и обмен то,
  • расколоть для петли в нескольких срезах, чтобы уменьшить время, необходимое, или
  • использовать таймер для s tart multiple for-loops, чтобы дать вашей программе некоторое время для дыхания между ними.
+0

то, что я собираюсь сделать, - это № 3 таймером. Благодарю. –

+0

@JO Здесь нет места для таймеров. Вы бы лучше, если бы могли правильно объяснить проблему. –

+0

@DavidHeffernan Моя проблема была в том, что ngln точно объяснил. Я использовал таймер, и он отлично работает без выдающейся перегрузки. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^