![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Vizor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.3.2006 Репутация: нет Всего: нет |
Всем привет, помогите реализовать синхронизацию, второй день капаю и ничего не получается. Спасибо заранее
Это сообщение отредактировал(а) Vizor - 4.11.2008, 22:02 |
|||
|
||||
archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
lock(this) никогда не следует писать. см. Рихтера
Для синхронизации он рекомендовал использовать приватный филд - если такого нету, можно самому его создать, и определить для него тип object (3 байта памяти, если не ошибаюсь). Это делаеться для того чтобы можно было рекурсивно входить в метод с блокировкой. Да и блокировать такой большой объект, кажись плохо для производительности. Но тут явно дело в другом. Я так понимаю, проблема в том что ты пытаешься изменить список айтомеов листа в другом потоке - а изменения в любом контроле должны выполняться в том же потоке в кором создался контрол.. (см BeginInvoke) (посмотрел внимательнее - ты ничего не изменяешь, так что все пока ок - но мало ли ![]() Но и это еще не все. В даном случае вообще плохо написано. Во-первых ты блокируешь себя в цикле, и там же делаешь слип - чего делать категорически нельзя (выходит твой езкемпляр листа постоянно заблокирован) А если посмотреть с точки зрения архитектуры - то тут вообще все не так как должно быть - контролл создает какой-то поток, который постоянно работает, слипаеться иногда - по-моему это неудачное решение. В контролла полно всяких событий - в данном случае помогло бы ItemChanged (или как оно там - влом смотреть в мсдн). Подписуешься на него и делаешь все изменения только тогда, когда изменяються итемы в контролле, а не каждый раз. ВОобще представь себе что я кинул таких контролов на форму 200 штук - выйдет что они создут 200 потоков. ![]() Добавлено @ 01:56 И вообще, почему тема в FAQ? ![]() Это сообщение отредактировал(а) archeg - 5.11.2008, 01:59 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет ![]() И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
Что-то я не вижу, что с чем тут должно синхронизироваться.
Насколько я читаю этот код, я вижу, что в конструкторе списка запускается поток, который захватывает список. Поток что-то непонятное делает с его айтемами. Что такое pTable и u непонятно. Затем поток ждёт одну секунду и завершается, освобождая список. В результате, я думаю, должен получиться список, который появляется на экране с запозданием. Потому что во время его появления он может быть захвачен потоком и не реагировать на сообщения графического интерфейса. Затем, когда поток завершается, список становится живым. Но зачем был нужен поток -- непонятно. Добавлено через 1 минуту и 28 секунд А, да, while(true) не заметил. Добавлено через 4 минуты и 46 секунд Это вообще вилы. Получается, поток никогда не завершается и постоянно держит список. Список освобождается на микросекунду после закрывающей скобки lock и до захода на новый виток цикла while. За это время, если повезёт, графическая оболочка успеет сама захватить список и что-то с ним сделать. Но что-то незначительное. А потом, когда она его отпустит, то данный поток снова его захватит и станет сканировать элементы. То есть, данный код представляет собой код "мёртвого" списка, который почти ни на что не реагирует. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |