Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.037 c
7-1081509708
Zheks
2004-04-09 15:21
2004.05.16
Как без лишних вопросов выключить комп под WinXP?


4-1079499482
Vilux
2004-03-17 07:58
2004.05.16
Не работает FindWindow


9-1073342523
Barlokf
2004-01-06 01:42
2004.05.16
Autorun для игр


4-1080158743
RyDmi
2004-03-24 23:05
2004.05.16
Свойства окна.


3-1082610665
Санёк
2004-04-22 09:11
2004.05.16
Как не вставлять пустую запись?




   Наверх