Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с потоками, Странный глюк 
V
    Опции темы
WERITAS
Дата 22.10.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Доброго времени суток. Не понимаю почему последние 3 строчки в listView'e абсолютно одинаковые, хотя Я это и запретил

Вот код:
Код

   public delegate void lvAdd(ListViewItem lw); 

    public partial class Form1 : Form
    {
        public Thread thr;
        public SortedList ObjSL = new SortedList();
        public int Ind = 1;

        public Form1()
        {
            InitializeComponent();
        }

        public void lwAddProc(ListViewItem lw) 
        {
            listView1.Items.Add(lw);
        }

        public void LVAdd()
        {
            // ......... Вычисления ............
            int k = 0;
            for (int i = 0; i < 10000; i++)
                k++;

            // Критическая секция
            lock (this)
            {
                string key = textBox1.Text + Ind.ToString();
                if (ObjSL.IndexOfKey(key) == -1)
                {
                    ObjSL.Add(key, textBox2.Text);

                    int CollCount = ObjSL.Count - 1;
                    ListViewItem lw = new ListViewItem();
                    lw.Text = ObjSL.GetKey(CollCount).ToString();
                    lw.SubItems.Add(ObjSL.GetByIndex(CollCount).ToString());
                                        
                    listView1.Invoke(new lvAdd(lwAddProc), lw);

                    ++Ind;
                }
                else
                    MessageBox.Show("Такой элемент уже есть в словаре!");

            }

            // ......... Вычисления ............
            int t = 0;
            for (int i = 0; i < 10000; i++)
                t++;

        }

        // Поток
        private void button3_Click(object sender, EventArgs e)
        {
            button3.Enabled = false;
            for (int i = 0; i < 12; i++)
            {
                thr = new Thread(new ThreadStart(LVAdd));
                thr.Start();
            }
            button3.Enabled = true;
        }



--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
0000
Дата 22.10.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



у тебя SortedList заполняется видимо не так как ты хочешь...он сортирует твои числа к примеру есть у тебя 0, 1, 2, 3, 4, 5, 6, 7, 8, 9..когда добавляешь 10 - он будет не по последнему индексу, а встанет под индексом 2..

а у тебя доступ к последнему элементу, который равен 9

поэтому применяй ToString() с форматов - например ToString("00"); - это для двузначных чисел

zaver, в одно время думаем одинаково =)

Это сообщение отредактировал(а) 0000 - 22.10.2007, 17:29
PM MAIL ICQ   Вверх
zaver
Дата 22.10.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



ошибка в том, что написав
Код

ObjSL.GetKey(CollCount)

ты думаешь, что это тот элемент, который ты добавил, а на самом деле это не так, начиная с 10ого элемента.
т.е. содержимое ObjSL выглядит так:

Код

CollCount==1
ObjSL - {1}

CollCount==2
ObjSL - {1,2}

****

CollCount==9
ObjSL - {1,2,3,4,5,6,7,8,9}

CollCount==10
ObjSL - {1,10,2,3,4,5,6,7,8,9}


ты думаешь, что 10 находится на месте 9.

Добавлено через 54 секунды
=) чуть опоздал))
PM MAIL WWW ICQ Skype YIM MSN   Вверх
WERITAS
Дата 22.10.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



 zaver
У меня встречный вопрос по поводу вашего совета:
Цитата
поэтому применяй ToString() с форматов - например ToString("00"); - это для двузначных чисел

smile  Я немного слукавил: на самом деле у меня там объект типа IPAddress, а не int. И для объекта этого типа такой финт что-то не срабатывает, копилятор ругается на параметр функции ToString(). Как поступить в таком случае, чтобы объекты добавлялись в четкой последовательности по мере их добавления в коллекцию?


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
0000
Дата 22.10.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



ToString("00") - означает, что твои числа будут в виде 01, 02, 03 и так далее...это формат чисел..

если используешь IPAddress, имхо тебе для них надо определить методы Equals и GetHashCode()
реализовать интерфейс IComparer для адресов и  при определении SortedList задать его в конструкторе
PM MAIL ICQ   Вверх
WERITAS
Дата 22.10.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Цитата(0000 @  22.10.2007,  20:25 Найти цитируемый пост)
реализовать интерфейс IComparer для адресов 

Для этого необходимо создать вспомогательный класс, верно?

Цитата(0000 @  22.10.2007,  20:25 Найти цитируемый пост)
тебе для них надо определить методы Equals и GetHashCode()

А можно поподробнее? 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
tol05
Дата 22.10.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(WERITAS @  22.10.2007,  19:51 Найти цитируемый пост)
Как поступить в таком случае, чтобы объекты добавлялись в четкой последовательности по мере их добавления в коллекцию? 

а чем плохи классы Stack и Queue ?
ИМХО лучше их никто тебе не гарантирует четкое соблюдение последовательности обработки добавленных в них элементов... Они ж для этого придуманы?

Непонятно, что тебе нужно: именно важна последовательность, в которой они к тебе пришли, или сортировка не по времени их появления, а по их значениям?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
0000
Дата 22.10.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



Цитата(WERITAS @ 22.10.2007,  22:02)
Цитата(0000 @  22.10.2007,  20:25 Найти цитируемый пост)
реализовать интерфейс IComparer для адресов 

Для этого необходимо создать вспомогательный класс, верно?

Цитата(0000 @  22.10.2007,  20:25 Найти цитируемый пост)
тебе для них надо определить методы Equals и GetHashCode()

А можно поподробнее?

да, реализуешь конкретный класс, наследуя его от интерфейса IComparer...
там всего 1 метод

если у тебя есть IPAddress, который можно представить через long...
и сравни их в методе Compare эти значения long...

тогда Equals и GetHashCode не понадобятся...это для того, чтобы в своем классе можно было определить свой метод сравнения...
хотя да, смудил я - они тебе не понадобятся

а вообще tol05 прав - поподробнее задачу объясни, может тебе действительно лучше использовать стэк или очередь?? или тебе действительно важен отсортированный порядок адресов и чтобы хранить их всех?
PM MAIL ICQ   Вверх
WERITAS
Дата 23.10.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



0000
Мне нужно, чтобы ip-адреса были не отсортированны по убывнию/возрастанию в коллекции, а чтобы именно были там в том порядке, в каком Я их туда добавил.

Допустим, Я добавил "127.0.0.1" -> "127.0.0.3" -> "127.0.0.2" в коллекцию. Нужно чтобы в коллекции было:
"127.0.0.1"
"127.0.0.3"
"127.0.0.2"

А если сделать сортировку, которую вы предлагаете, в коллекции не окажется последовательности
"127.0.0.1"
"127.0.0.2"
"127.0.0.3"
??????????????????

Я написал вот такой вот класс:
Код

public class SortByIP : IComparer
        {
            public SortByIP()
            { }

            int IComparer.Compare(object obj1, object obj2)
            {
                IPAddress ip1 = (IPAddress)obj1;
                IPAddress ip2 = (IPAddress)obj2;

                if (ip1.Address > ip2.Address)
                    return 1;
                if (ip1.Address < ip2.Address)
                    return -1;
                else
                    return 0;
            }
        }

Правильно ли это и как мне теперь его задать в конструкторе?


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
0000
Дата 23.10.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



тогда убирай SortedList..
если тебе надо просто порядок - использую List<IPAddress>

если надо хранить пару ключ-значение использую либо HashTable, либо Dictionary<KeyType, ValueType>

HashTable лучше применять, если тип не определен (там key и value имеют тип object), или когда значений там будет храниться не очень много...
они просто сохраняют порядок - как добавишь, так и будут... 

List при желании можно потом отсортировать...

если же тебе будет важно еще в каком порядке необходим доступ к элементу (например, первым брать того, кто пришел раньше всех), то использую Queue или Stack (первым берешь того, кто пришел последним)... их можно тоже привязать к типам Stack<IPAddress> или Queue<IPAddress>
PM MAIL ICQ   Вверх
WERITAS
Дата 24.10.2007, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Вобщем я разобрался... СПАСИБО ВСЕМ!  smile  Тема себя исчерпала


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.