Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Потоки!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
8-1077375996
Cerber
2004-02-21 18:06
2004.05.16
Прозрачность.


4-1080817089
Lobster
2004-04-01 14:58
2004.05.16
Горячие клавиши


14-1082825195
PaRL
2004-04-24 20:46
2004.05.16
Образование


3-1082112658
Dimbas
2004-04-16 14:50
2004.05.16
Проблема открытия базы с CD


1-1083415414
Jiurasdfgfr
2004-05-01 16:43
2004.05.16
Как в StringGrid вызвать OnDrawCell?