|
|
| Посл.отвђт | Сообщен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 |