Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2010, 13:34   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Общение tThread и ListView.items

Всем привет!

Проблема:
В ListView 2 колонки:
Название
Статус

при запуске потоку передаётся номер(ItemIndex) элемента ListView.items к которому принадлежит поток.

По номеру ItemIndex поток посылает в колонку Статус сообщения.

Но вот если с ListView добавить или убрать элемент. То поток в случае добавления элемента будет посылать сообщения не своему item'у, а чужому.

в случае удаления поток попытается послать сообщение item/s которого уже нет в списке, и вызовет AccesViolation.

Как это можно исправить?

При помощи чего можно уведомить поток о том что произошло? Хотелось бы наглядного примера или подробной растолковки ситуации.
Человек_Борща вне форума Ответить с цитированием
Старый 30.12.2010, 13:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как это можно исправить?
При удалении скажем приостановить поток, удалить Item, и заNILить его.
Фишка в том чтобы в потоке было поле - TListItem, которому передается итем, с которым будет работать поток, а не передавать потоку ItemIndex.
Тогда при удалении этот Итем и освобождай. а в потоке проверяй - если он не nil то продолжать иначе выйти
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 14:45   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

гм все немного сложно=)

А если SendMessages ипользовать? и при помощи них сообщать новый индекс...
Человек_Борща вне форума Ответить с цитированием
Старый 30.12.2010, 14:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Поясню примером )
Становись на Итем, и жми кнопку - итем удалится, его поток прекратит работу.
Вложения
Тип файла: rar Новая папка.rar (3.1 Кб, 29 просмотров)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 15:23   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не так поняли=)

В LIstView 3 итема и один поток принадлежный к итему с индексом 2.

0 - Неработает
1 - неработает
2 - работает

удаляем 1 итем,
получается
0 - неработает
1 - работает

в поток 1 итема(Бывший 2-ой) хранит значение 2, потому что изначально 3 итема(0,1,2). При попытке послать сообщение на 2 индекс, вываливает AV потому что элемента с индексом 2 нет вообще т.к. есть только 0 и 1.

Последний раз редактировалось Человек_Борща; 30.12.2010 в 15:26.
Человек_Борща вне форума Ответить с цитированием
Старый 30.12.2010, 15:45   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
в поток 1 итема(Бывший 2-ой) хранит значение 2, потому что изначально 3 итема(0,1,2). При попытке послать сообщение на 2 индекс, вываливает AV потому что элемента с индексом 2 нет вообще т.к. есть только 0 и 1.
посылать не ту иформацию которая ЗАВИСИТ от внешних непредсказуемых данных (индекс ListView) , а ту которая НЕ зависит от внешних данных (например идентификатор процесса) и пусть уже сам ListView определяет к какому Item сообщение относится. Для этого у него (у TListViewItem) есть замечательное cвойство Data.
Или же как сказал Stilet в Thread хранить не индекс а ссылку на TListViewItem которую и посылать. И при этом не забывать чистить эту самую ссылку при удалении в ListView.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.12.2010, 17:53   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
данных (например идентификатор процесса) и пусть уже сам ListView определяет к какому Item сообщение относится.
при помощи чего это реализовать? Изменился listview и тогда посылать всем потокам новые индексы? Или как?
Человек_Борща вне форума Ответить с цитированием
Старый 30.12.2010, 20:07   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Изменился listview и тогда посылать всем потокам новые индексы?
Список то изменился, но элементы его остались привязанными к потокам
В том и дело что поток привязывается (в моем примере) не к индексу, который изначально нестабилен, а к элементу, который до момента освобождения аки пуп земли несокрушим и не сдвинуть его никому ). А то что ListView у себя в канве перестраивает, это его проблемы - обьекты все равно размещены так что поток, привязанный к обьекту знает всегда где он и как к нему обратится
(Не здря я тебе пример дал где не по индексу связь )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 22:08   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Для этого у него (у TListViewItem) есть замечательное cвойство Data.
Которое ПРЕДНАЗНАЧЕНОдля хранения данных пользователя. Храните в нем данные о потоке. (указатель, идентификатор). И при получение сообщений от потока сверяйтесь.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перетащить элемент ListView в другой ListView? Paul Hindenburg Компоненты Delphi 5 26.01.2013 11:35
программное добавление items в ListView Марк Охман Общие вопросы Delphi 4 30.12.2010 16:44
Синхронизация работы Tthread и данных в ListView как реализовать? Человек_Борща Общие вопросы Delphi 4 20.12.2010 01:00
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. Casper-SC WPF, UWP, WinRT, XAML 2 12.08.2010 19:04
Удаление Items в ListView BioHEX Общие вопросы Delphi 1 04.01.2010 19:43