Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
25 / 25 / 3
Регистрация: 10.06.2009
Сообщений: 134

Доступ к контролам формы из другого потока

04.03.2013, 09:27. Показов 2876. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некая функция, которая анализирует текстовых файлов и их содержимое записывает в ListView в "детальном" виде с очисткой ListView перед началом каждого файла. Строчек для записи может быть около 200. Вызывается функция асинхронно через BackgroundWorker. Доступ к ListView пытался ставить и через Invoke для каждой попытки записи строки, и через BeginInvoke на пару с EndInvoke для всего цикла анализа и записи. Оно то работает без ошибок но в первом случае чудовищное мигание ListView, загрузка проца на 100% и, соответственно, медленная обработка, а во втором - обработка происходит буквально за секунду, но содержимого не видно вообще.
Единственное что я смог придумать, дабы избежать "мигания", это вставить в цикл обработки Sleep на 10 мс...

Код самой функции:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
'Private Delegate Function P017Invoker(ByVal Frm As frmZp_str, ByVal fName As String) As Boolean
 
    Private Function P017(ByVal Frm As frmZp_str, ByVal fName As String) As Boolean
        'If Frm.lstData.InvokeRequired Then
        '    Return CBool(Frm.lstData.Invoke(New P017Invoker(AddressOf P017), New Object() {Frm, fName}))
        'Else
            Dim srInFile As StreamReader = New StreamReader(fName, System.Text.Encoding.GetEncoding(866))
            Dim Buffer As String = ""
 
            With Frm
                .lblStatusCurrentDocSum.Text = CDbl(srInFile.ReadLine().Substring(79, 10).Insert(8, ".")).ToString
                While (srInFile.Peek > -1) And (Not worker.CancellationPending)
                    Thread.Sleep(ToInt32(My.Settings.Delay))
                    Buffer = srInFile.ReadLine()
                    .lblStatusCurrentDoc.Text = fName.Substring(fName.LastIndexOf("\"c) + 1)
                    .lblWorkers.TextInvoked((ToInt32(.lblWorkers.Text) + 1).ToString)'*Invoked - пользовательские расширения для некоторых классов
 
                    .lstData.Items.Add(.lblWorkers.Text)
 
                    '.lstData.Items(Convert.ToInt32(.lblWorkers.Text) - 1).SubItems.AddRange({Buffer.Substring(5, 14), Buffer.Substring(46, 99).Trim, _
                    '                        .mtxtPuch.Text, ToInt32(Buffer.Substring(38, 6)).ToString + "." + Buffer.Substring(44, 2), _
                    '                        (.txtOrder.Text + "_" + Buffer.Substring(46, 99).Trim).Replace(" "c, "_"c)})
 
                    .lstData.AddLineInvoked(.lblWorkers.Text, {Buffer.Substring(5, 14), Buffer.Substring(46, 99).Trim, _
                                            .mtxtPuch.Text, ToInt32(Buffer.Substring(38, 6)).ToString + "." + Buffer.Substring(44, 2), _
                                            (.txtOrder.Text + "_" + Buffer.Substring(46, 99).Trim).Replace(" "c, "_"c)})
                    .lblStatusCurrentProgSum.Text = (ToDouble(.lblStatusCurrentProgSum.Text) + ToDouble(Buffer.Substring(38, 8).Insert(6, "."))).ToString
                    '.lstData.Update()
                End While
                srInFile.Close()
                If Not ErrorSumMatch(CDbl(.lblStatusCurrentDocSum.Text), CDbl(.lblStatusCurrentProgSum.Text), fName) Then
                    Return False
                End If
                .lblStatusDoneDocs.Text = CStr(CInt(.lblStatusDoneDocs.Text) + 1)
                If .rdbtnAll.Checked Then
                    CheckForEmtySum(Frm)
                    WriteDataToFile(Frm)
                    NewDocument(Frm)
                End If
            End With
            Return True
        'End If
    End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2013, 09:27
Ответы с готовыми решениями:

Доступ к контролам из другого потока
Как мне получить доступ к контролам на форме из другого потока? Есть код который должен проверить checkbox свойство checked в отдельном...

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

Доступ к элементам формы из другого потока
Есть функция, которая запускается отдельным потоком: static unsigned __clrcall ThreadFunc1(void* pArguments) { Form1 ^...

4
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.03.2013, 09:54
Может быть это Вам поможет.
0
25 / 25 / 3
Регистрация: 10.06.2009
Сообщений: 134
05.03.2013, 19:53  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Может быть это Вам поможет.
Неа. Тоже пробовал. BeginUpdate предотвращает перерисовку вообще. А мне нужно видеть строки в процессе их добавления в таблицу.
То есть, если сделать так:
VB.NET
1
2
3
4
5
ListView1.BeginUpdate()
While условие
      'добавление строк
End While
ListView1.EndUpdate()
то по завершению цикла на долю секунды покажется итоговый результат, потом таблица очистится и пойдет обработка следующего файла из внешнего цикла. Заметить этот "результат" я просто не успею.
Если же сделать так:
VB.NET
1
2
3
4
5
While условие
ListView1.BeginUpdate()
      'добавление строк
ListView1.EndUpdate()
End While
то получу то же самое мигание...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.03.2013, 22:53
Можно попробовать порциями по несколько строк выводить, пока не накопится нужного числа или не закончится цикл. Или в самом цикле добавлять записи в некий внутренний лист, а по таймеру прорисовывать содержимое этого листа в экранный лист.
0
25 / 25 / 3
Регистрация: 10.06.2009
Сообщений: 134
05.03.2013, 23:17  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно попробовать порциями по несколько строк выводить, пока не накопится нужного числа или не закончится цикл. Или в самом цикле добавлять записи в некий внутренний лист, а по таймеру прорисовывать содержимое этого листа в экранный лист.
Думал, но не пробовал. Решил оставить как вариант "на крайний случай", если не найдется какого-нидь способа попроще, так как в этом надо дополнительные циклы, проверки.
Да и то, мне кажется, что ничего не выйдет, так как для сохранения скорости обработки, таблица тоже должна перерисовываться быстро.

Вот если бы перерисовывался не весь контрол, а лишь его введенная строка...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2013, 23:17
Помогаю со студенческими работами здесь

Доступ к элементам формы из другого потока
Хочу сделать в фоновом потоке добавление UserControl в StackPanel. Старт потока: Thread t = new Thread(Add); ...

Доступ к элементу формы из другого потока
Добрый день! Хочу по событию изменить текст кнопки. private void OnDisconnected(object sender, DisconnectedEventArgs args) ...

Доступ к элементам формы из другого класса/Потока
Здравствуйте, у меня есть класс работы потоков, при выполнении метода (В потоке) должна идти запись в label на форму, подскажите как это...

Доступ к контролам из потока
Есть поток,как сделать чтоб он "видел" элементы - textbox,button,lable

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru