Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизПотоки! Найти похожие ветки
← →
WondeRu © (2004-04-28 10:46) [0]Привет!
Есть 2 потока: один отображает данные, а другой изменяет их!
Обображаются объекты из списка List1.
Отображение:
for i := 0 to List1.Count - 1 do
TSomeObject(List1[i]).Draw;
Изменение:
for i := List1.Count - 1 downto 0 do
if TSomeObject(List1[i]).X > 0 then
begin
TSomeObject(List1[i]).Free;
List1.Delete(i);
end;
Но иногда возникает ситуация, когда элемент удален, а отображение пытается к нему обратиться!
Как посоветуете избежать этого?
Спасибо!
← →
ASMiD © (2004-04-28 10:56) [1]В приведенном примере именно так и должно получиться т. к.
после Delete(i) i может быть больше List1.Count - 1
Как отсюда вылезать - решай сам.
← →
Ihor Osov'yak © (2004-04-28 10:58) [2]Почитать о синхронизации потоков, например, того же Рихтера, если не изменяет память - глава 10 (3 редакция).
Кроме того, если пишем на D с использованием VCL (а вероятнее всего, что так) - подумать о том, надо ли "отображать" в отдельном потоке. Если нет знаний, опыта для самостоятельного размышления на эту тему - поверте на слово - не надо.
← →
evvcom © (2004-04-28 11:00) [3]
> после Delete(i) i может быть больше List1.Count - 1
Ну и что? Цикл используется с downto.
2WondeRu: используй синхронизирующие критические секции.
← →
panov © (2004-04-28 11:01) [4]Кода потоков не видно.
← →
MBo © (2004-04-28 11:04) [5]а также TThreadList
← →
WondeRu © (2004-04-28 11:22) [6]2Ihor Osov"yak © (28.04.04 10:58) [2]
VCL не пользую, отображает OpenGL
>Кода потоков не видно.
procedure TThr1.Execute..
begin
repeat
sleep(100);
for i := List1.Count - 1 downto 0 do
if TSomeObject(List1[i]).X > 0 then
begin
TSomeObject(List1[i]).Free;
List1.Delete(i);
end;
until Not Terminated;
end;
а отображение по таймеру
>а также TThreadList
????
← →
panov © (2004-04-28 11:24) [7]Попробуй критические секции использовать.
← →
WondeRu © (2004-04-28 11:28) [8]попробую делфовский пример, авось заработает путево!
with MyThreadList.LockList do
try
for X := 0 to Count-1 do
Something(Items[X]);
finally
MyThreadList.UnlockList;
end;
← →
MBo © (2004-04-28 11:28) [9]>а также TThreadList
>????
F1?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.052 c