179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Дополнительный поток тормозит главный

05.03.2018, 10:14. Показов 889. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.

Вот код, использующий работу нескольких потоков:

Кликните здесь для просмотра всего текста
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
Public Class Form1
    ' Переменные для организации дополнительного потока, в котором будет выполнена его основная процедура LongProc1()
    Private Delegate Sub _dlgProc1()
    Private CallBackProc1 As New _dlgProc1(AddressOf RunTimeProc1)
    ' Эта процедура будет выполнена не в основном, а в отдельном потоке 
    Sub LongProc1()
        Try
            ' Организуем бесконечный цикл
            Do While (1)
                ' Сдесь хотелось бы вставить задержку в миллисекундах
                Me.Invoke(CallBackProc1) ' В конечном итоге здесь будет "крутиться" RunTimeProc1()
            Loop
        Catch ex As Exception
            Exit Sub
        End Try
    End Sub
    ' Эта процедура будет выполнятся не в основном, а в отдельном потоке
    Sub RunTimeProc1()
        Static n As Integer
        n += 1
        Label1.Text = n.ToString
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim th As New MethodInvoker(AddressOf LongProc1)
        th.BeginInvoke(Nothing, Nothing)
    End Sub
    ' Для сравнения то же самое организуем в главном потоке в таймере
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Static n As Integer
        n += 1
        Label2.Text = n.ToString
    End Sub
End Class


Дополнительный поток не даёт работать основному. Что не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2018, 10:14
Ответы с готовыми решениями:

Главный поток и вторичный
1. При нажатии на кнопку Start в новом потоке запускается server.AcceptTcpClient() (который...

BackgroundWorker блокирует главный поток
Подскажите как поправить. Код копирует файлы отмеченные галочками в ListView, увеличивает значение...

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

Получить результат из потока в главный поток
Всем добрый вечер. Я только начинаю изучать многопоточность, столкнулся со следующей задачей:...

2
Администратор
Эксперт .NET
17511 / 13740 / 5292
Регистрация: 17.03.2014
Сообщений: 28,219
Записей в блоге: 1
05.03.2018, 11:48 2
jkrnd, метод Invoke выполняет код в потоке в котором был создан элемент управления т.е. в главном потоке. Следовательно приведенный код постоянно загружает основной поток работой. Нужно перестать это делать или снизить частоту вызовов до приемлемой.
1
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 13:09  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
перестать это делать
это так ?:
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
Public Class Form1
    Dim m As Integer
    Dim th As New Threading.Thread(AddressOf RunTimeProc1)
    ' Эта процедура будет выполнятся не в основном, а в отдельном потоке
    Private Sub RunTimeProc1()
        While True
            Try
                m += 1
                If m > 20000 Then m = 0
            Catch ex As Exception
 
            End Try
            Threading.Thread.Sleep(100)
        End While
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        th.IsBackground = True  ' Иначе после закрытия формы поток сам не закроется
        th.Start()
    End Sub
    ' Для сравнения то же самое организуем в главном потоке в таймере
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Static n As Integer
        n += 1
        Label2.Text = n.ToString
        Label1.Text = m.ToString
    End Sub
End Class
Цитата Сообщение от OwenGlendower Посмотреть сообщение
снизить частоту вызовов до приемлемой
это о инструкции
VB.NET
1
 Threading.Thread.Sleep(100)
но куда её влепить в предыдущем коде?
0
05.03.2018, 13:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2018, 13:09
Помогаю со студенческими работами здесь

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

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

Дополнительный поток: как реализовать
Добрый день! Помогите пожалуйста добавить поток в программу, просто не могу сам разобраться в...

Как создать дополнительный поток?
сабж. пробовал создавать так: void Thread( void* pParams ) { int i, num = 0; while ( 1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru