· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› SysListView32

Посл.отвђт Сообщенiе


Дата: Апр 13, 2003 19:16:23

Привет!
Вот столкнулся с сабжем.
При удалении элемента из списка все
остальные смещаются вверх.
И естественно меняются номера итемов
нижестоящих. Поэтому моя
прога начинает слать сообщения
уже другим (на 1 меньше) итемам.
Получается полный бред.
Или, если средний удалить какой, то
вообще останавливается изменение
подитема вышестоящего. :(
Как мне с этим "бороться"?
Я знаю, что шлётся какое-то
сообщение, что мол поменялось количество
элементов списка.
Что это за оно и как мне
сразу же поменять в структурах
итемы?
Ведь в процессвьювере, когда
прибиваешь процесс, то
ниже стоящий не показывает же инфу
другого. :/
Помогите плз.


Дата: Апр 14, 2003 06:19:36

Аноним Апр 13, 2003 19:16:23
моя прога начинает слать сообщения уже другим (на 1 меньше) итемам.
Ни кто не заставляет Вас идентифицировать элементы списка по номеру. Тем более, что при создании списка может быть указан стиль LVS_SORTxxxx или в программе появится необходимость сортировки.

Я знаю, что шлётся какое-то
сообщение, что мол поменялось количество
элементов списка.

WM_NOTIFY + LVN_xxxx.


Дата: Апр 14, 2003 14:22:45

Блин, толку никакого от
этого ответа. Это дело я понимаю и сам.
У меня в проге запускается 6 тредов,
ну а они шлют результат своей работы
в подитемы итемов (названия тредов).
Удаляешь 3, например, и нижний сразу
вешается - на месте стоит, т.к.
номер 3 стал, 5 тред показывает значение 4,
и т.п.
Что делать?


Дата: Апр 14, 2003 20:25:16

Каждый елемент в листе можно ассоциировать с любым обьектом через lParam (внутри LVITEM). Даже если елемент удален - ассоциация останется. Если Вы поставите Ваш индекс в lParam, тогда после удаления, скажем, 4-го елемента, 5-й елемент все равно будет иметь индекс 5 в lParam. Для этих операций используются сообщения LVM_SETITEM/LVM_GETITEM.


Дата: Апр 15, 2003 07:30:57 · Поправил: P2M

Аноним Апр 14, 2003 14:22:45
Блин, толку никакого от этого ответа.
Каков вопрос - таков ответ.

Вы следите за чужим ListView'ом?
Или посторонняя программа удаляет/добавляет элементы в список?


Дата: Апр 15, 2003 14:03:13

Нет, ListView мой.
Результаты работы тредов отображаются
в виде списка.
Треды можно добавлять и удалять.
Так вот при удалении и
глючит.
Я просто не знаю как это дело
обработать.


Дата: Апр 15, 2003 19:37:23

Я просто не знаю как это дело
обработать.

Послушайте AsmGuru62:
Каждый елемент в листе можно ассоциировать с любым обьектом через lParam

Вот и ассоциируйте lParam каждого итема с ID соответствующего треда. Покажите фрагмент кода.


Дата: Апр 15, 2003 20:54:59

Вот функция, запускаемая в тред:

Function proc uses ebx esi num:DWORD

LOCAL result:DWORD
LOCAL lvi:LV_ITEM
LOCAL buf[10]:BYTE

mov lvi.imask,LVIF_TEXT+LVIF_PARAM
m2m lvi.iItem,num
mov lvi.iSubItem,0
invoke wsprintf,addr buffer,addr szProcess,procnumber
m2m lvi.pszText,offset buffer
m2m lvi.lParam,num
invoke SendMessage,hList,LVM_INSERTITEM,0,addr lvi
mov lvi.imask,LVIF_TEXT
mov lvi.iSubItem,2
xor eax,eax
mov result,eax
xor ebx,ebx
lea esi,offset pr_1
mov edx,num
lea esi,[esi+edx*4]
@loop:
mov edx,[esi]
test edx,edx
jz @exit
inc ebx
mov eax,result
add eax,ebx
mov result,eax

invoke wsprintf,addr buf,addr szResult,result
lea eax,buf
mov lvi.pszText,eax
invoke SendMessage,hList,LVM_SETITEM,0,addr lvi

invoke Sleep,30
cmp ebx,29Ah
jne @loop
@exit:
invoke ExitThread,0
ret

Function endp

num - это типа индификационный номер
треда в проге. Вообще их максимум 6.
pr_1 - адрес массива dd флагов состояния тредов: 0 - отключён, 1 - в работе.
Тред считает сумму ариф. прогрессии
почленно: 1...666, d=1.


Дата: Апр 15, 2003 22:58:11

Пжлста, вышлите мне полный код на cpp_master@ukr.net


Дата: Апр 16, 2003 05:01:29

Аноним Апр 15, 2003 20:54:59
1. Прежде чем делать LVM_INSERTITEM не плохо бы проверить может такой элемент уже есть.

2. Прежде чем делать LVM_SETITEM не плохо бы проверить может такого элемента уже нет.

2. Инструкция MOV воздействует на флаг ZF, поэтому следующая за ней test edx,edx не нужна, т.е. можно сразу cmp [esi],0.

3. Используйте для накопления результата edi, тогда отпадет необходимость в использовании result и eax.

4. Для завершения thread'а не надо вызывать ExitThread. Почитайте Рихтера, там четко сказано, что функция thread'а вызывается примерно так:
[code]
ExitThread( pfnStartAddr(pvParam));
[/code]

5. Вы знаете, что SendMessage приостанавливает работу thread'а, до возврата, и если внутри SendMessage произойдет "затор", то Ваш thread встанет?

6. Вы знаете о синхронизации доступа к данным, в Вашем случае к массиву флагов? В этой программе, возможно проблем не возникнет, потому что поток только читает, однако в общем случае могут возникнуть проблемы.


Дата: Апр 16, 2003 19:21:12

Ну всё...
Вроде всё работает (на Win ME, по крайней мере).
Тему считать закрытой.

Вы знаете о синхронизации доступа к данным, в Вашем случае к массиву флагов?
Я эти массивы уже поудалял :)


Дата: Апр 16, 2003 19:48:31

"...Инструкция MOV воздействует на флаг ZF..." - Странно это - а я считал, что MOV не меняет флаги. Интересно, откуда эта информация?


Дата: Апр 16, 2003 21:35:25

Да, и cmp [esi],0 не идёт...


Дата: Апр 17, 2003 03:57:40

AsmGuru62
Интересно, откуда эта информация?
Извеняюсь. Это я наврал.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.048