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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BackgroundWorker 
:(
    Опции темы
noob4ever
Дата 19.7.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вопрос: почему во время запуска фонового процесса форму не могу двигать и кнопки нажимать?? ведь запускается в отдельном процессе, кстати с копированием файла все выходит, а тут нет, форма не реагирует до завершения процесса.  я начинаю разбираться и постоянно натыкаюсь на какой нибудь камешек  

Код

 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i, j As Long
        For i = 0 To 1000000
            BackgroundWorker1.ReportProgress(j \ 10000)
            j += 1
        Next i  
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
  End Sub




Это сообщение отредактировал(а) noob4ever - 19.7.2009, 23:40
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Дело в том, что из метода, который по идее должен вызываться асинхронно ты обращаешься к самому бэкграундвокеру, а он создан в том же потоке, что и форма, а стало быть и операция выполняется в нём же. Чтобы этого избежать надо обратиться к методу Invoke формы, для вызова метода в её потоке
Код

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim repDel As New Report(AddressOf BackgroundWorker1.ReportProgress)
        For i As Integer = 0 To 1000000
            Me.Invoke(repDel, i \ 10000)
        Next i
    End Sub

    Delegate Sub Report(ByVal progress As Integer)

    Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub


Вот так всё сработает

Это сообщение отредактировал(а) diadiavova - 20.7.2009, 01:36


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
noob4ever
Дата 20.7.2009, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



форма тормозит жутко, но управление не пропадает

кстате странное дело, время работы :

To 100000

Код

Me.Invoke(repDel, j \ 1000)   - 8с
BackgroundWorker1.ReportProgress(j \ 1000) - 2с

PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Ну так через посредника ведь всё делается, да ещё и в разных потоках, там есть свои сложности.
Можно попробовать реализовать по-другому. Не вызывать из другого потока метод ReportProgress, а вместо этого скидывать данные в переменную, а из основного потока считывать их по таймеру. Другой вариант не вызывать метод так часто, а только тогда, когда значение прогресса реально меняется
Код

            For i As Integer = 0 To 1000000
                If i Mod 10000 = 0 Then
                    Me.Invoke(repDel, i \ 10000)
                End If
            Next i



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
noob4ever
Дата 20.7.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(diadiavova @ 20.7.2009,  11:11)
Ну так через посредника ведь всё делается, да ещё и в разных потоках, там есть свои сложности.
Можно попробовать реализовать по-другому. Не вызывать из другого потока метод ReportProgress, а вместо этого скидывать данные в переменную, а из основного потока считывать их по таймеру. Другой вариант не вызывать метод так часто, а только тогда, когда значение прогресса реально меняется
Код

            For i As Integer = 0 To 1000000
                If i Mod 10000 = 0 Then
                    Me.Invoke(repDel, i \ 10000)
                End If
            Next i

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

для проверки поставил 10 миллионов и за 1 секунду выполнилось если проверять остаток.  smile 

Это сообщение отредактировал(а) noob4ever - 20.7.2009, 14:10
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Не проверка, просто так ты вызываешь метод в 100 раз реже. На этом и экономишь.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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