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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потока 
:(
    Опции темы
Vizor
  Дата 4.11.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет, помогите реализовать синхронизацию, второй день капаю и ничего не получается. Спасибо заранее

Код

public partial class List_Client : ListView
    {
        int nUpdate = 1000;
        public List_Client()
        {
            Thread pThread = new Thread(new ThreadStart(UpdateClient));
            pThread.Name = "UpdatePing";
            pThread.Start();
        }
        
        private void UpdateClient()
        {
            while (true)
            {
                lock (this)
                {
                    if (pTable.Count > 0)
                    {
                        for (int i = 0; i < Items.Count; i++)
                        {
                            ListViewItem pItem = Items[i];
                            string str = pItem.Text;
                            int u = 0;
                        }
                    }
                    Thread.Sleep(nUpdate);
                }
            }
       }



Это сообщение отредактировал(а) Vizor - 4.11.2008, 22:02
PM   Вверх
archeg
Дата 5.11.2008, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 11
Всего: 27



lock(this) никогда не следует писать. см. Рихтера
Для синхронизации он рекомендовал использовать приватный филд - если такого нету, можно самому его создать, и определить для него тип object (3 байта памяти, если не ошибаюсь). Это делаеться для того чтобы можно было рекурсивно входить в метод с блокировкой. Да и блокировать такой большой объект, кажись плохо для производительности.

Но тут явно дело в другом. Я так понимаю, проблема в том что ты пытаешься изменить список айтомеов листа в другом потоке - а изменения в любом контроле должны выполняться в том же потоке в кором создался контрол.. (см BeginInvoke) (посмотрел внимательнее - ты ничего не изменяешь, так что все пока ок  - но мало ли smile )

Но и это еще не все. В даном случае вообще плохо написано. Во-первых ты блокируешь себя в цикле, и там же делаешь слип - чего делать категорически нельзя (выходит твой езкемпляр листа постоянно заблокирован)

А если посмотреть с точки зрения архитектуры - то тут вообще все не так как должно быть - контролл создает какой-то поток, который постоянно работает, слипаеться иногда - по-моему это неудачное решение. В контролла полно всяких событий - в данном случае помогло бы ItemChanged (или как оно там - влом смотреть в мсдн). Подписуешься на него и делаешь все изменения только тогда, когда изменяються итемы в контролле, а не каждый раз. 

ВОобще представь себе что я кинул таких контролов на форму 200 штук - выйдет что они создут 200 потоков.  smile

Добавлено @ 01:56
И вообще, почему тема в FAQ?  smile 

Это сообщение отредактировал(а) archeg - 5.11.2008, 01:59


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Dims
Дата 5.11.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



Что-то я не вижу, что с чем тут должно синхронизироваться.

Насколько я читаю этот код, я вижу, что в конструкторе списка запускается поток, который захватывает список. Поток что-то непонятное делает с его айтемами. Что такое pTable и u непонятно. Затем поток ждёт одну секунду и завершается, освобождая список.

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

Но зачем был нужен поток -- непонятно.

Добавлено через 1 минуту и 28 секунд
А, да, while(true) не заметил.

Добавлено через 4 минуты и 46 секунд
Это вообще вилы. Получается, поток никогда не завершается и постоянно держит список. Список освобождается на микросекунду после закрывающей скобки lock и до захода на новый виток цикла while. За это время, если повезёт, графическая оболочка успеет сама захватить список и что-то с ним сделать. Но что-то незначительное. А потом, когда она его отпустит, то данный поток снова его захватит и станет сканировать элементы.

То есть, данный код представляет собой код "мёртвого" списка, который почти ни на что не реагирует.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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