Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/35: Рейтинг темы: голосов - 35, средняя оценка - 4.83
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398

Воспроизведение GIF в параллельном потоке

20.11.2015, 22:22. Показов 8574. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть окно, информирующее пользователя о том что идет обработка данных. Поместил на форму GIF-картинку с часами.

Как сделать, чтобы часы шли?
Миниатюры
Воспроизведение GIF в параллельном потоке  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2015, 22:22
Ответы с готовыми решениями:

ProgressBar в параллельном потоке
Здравствуйте, пишу на qt 3.3 . Необходимо сделать прогресс бар при записи на двд диск под линуксом,чтобы пользователь знал что программа...

Таймер в параллельном потоке
Всем доброго времени. Начал изучать много-поточное программирование и сразу наткнулся на сложность. У меня есть таймер который изменяет...

OpenGL в параллельном потоке Qt5
Приветствую всех, мне необходимо отображать в программе большое количество OpenGL окон, каждое из них достаточно тяжёлое, поэтому нужно...

91
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
27.11.2015, 07:04
Студворк — интернет-сервис помощи студентам
VB.NET
1
 Public Tme As New Tm
Надо так было попробовать
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
27.11.2015, 16:12  [ТС]
При запуске программы отрабатывает процедура:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
    '=================================================================================================='
    '                                            PROCEDURE                                             ' 
    '                                  Создание/активация формы Tme                                    '
    '=================================================================================================='
 
    Public Sub Tm_ac()
        Tme = New Tm
 
        Tme.WindowState = FormWindowState.Normal
        Tme.Activate()
 
    End Sub
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
27.11.2015, 19:47
Извини, не туда смотрел, все верно. Проблема оказывается совсем в другом. Для второго варианта
VB.NET
1
2
3
4
5
6
7
8
9
    Public Sub Pic_Refr2(ByVal TextObj As Object)
        System.Threading.Thread.Sleep(CType(TextObj(1), Integer))
        If Th2_exist Then 'добавить условие
            Tme.Label1.Text = CType(TextObj(0), String)
 
            Tme.ShowDialog()
        End If
 
    End Sub
Поменять местами отмеченное для корректной работы
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        If Not Th2_Exist Then
            Th2 = New System.Threading.Thread(AddressOf Pic_Refr2)
 
            Th2.SetApartmentState(System.Threading.ApartmentState.STA)
 
            Th2.Start(New Object() {Mes, Interval}) ' это
 
            Th2_exist = True ' и это
 
 
        End If
Добавлено через 1 час 8 минут
И здесь тоже поменять. По порядку
VB.NET
1
2
3
4
5
6
7
8
                If Th2.IsAlive Then
                    Tme.DialogResult = Windows.Forms.DialogResult.OK'2
 
                    Th2 = Nothing'3
 
                    Th2_exist = False '1
                End If
            End If
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
27.11.2015, 20:15  [ТС]
Это менять не имеет смысла:

VB.NET
1
2
3
Th2.Start(New Object() {Mes, Interval}) ' это
 
Th2_exist = True ' и это
Потому что Th2_exist - это просто логическая переменная и все и ее новое измененное значение потребуется ТОЛЬКО при СЛЕДУЮЩЕМ вызове процедуры Shp2.

То же самое и здесь:

VB.NET
1
2
3
4
5
6
7
If Th2.IsAlive Then
                    Tme.DialogResult = Windows.Forms.DialogResult.OK'2
 
                    Th2 = Nothing'3
 
                    Th2_exist = False '1
                End If
А ВООБЩЕ, все это ВОЗМУТИТЕЛЬНО до крайности.

Вот я получаю Ошибку:
************** Текст исключения **************
System.Threading.ThreadAbortException: Поток находился в процессе прерывания.
Прерывание System.Threading.ThreadAbortException вызывается методом Th2.Abort(). Я что, НА АССЕМБЛЕРЕ что ли программирую?! Я что КАКИЕ-ТО ТАМ ПРЕРЫВАНИЯ должен отслеживать? Пусть DOTNET отслеживает - и корректно свои задачи выполняет. A VB.NET - это ВЫСОКОУРОВНЕВЫЙ язык - И НЕ МОЯ ЗАБОТА ПРЕРЫВАНИЯ отслеживать. Это комментарий к тому, что В NET-е ВСЕ ПРОДУМАНО. Думали НЕ ТЕМ МЕСТОМ (имеется в виду часть тела), видимо.

Добавлено через 3 минуты
А почему тогда не вот так:

VB.NET
1
2
3
4
5
6
7
8
9
    Public Sub Pic_Refr2(ByVal TextObj As Object)
        If Th2_exist Then 'добавить условие
            System.Threading.Thread.Sleep(CType(TextObj(1), Integer))
            Tme.Label1.Text = CType(TextObj(0), String)
 
            Tme.ShowDialog()
        End If
 
    End Sub
Добавлено через 7 минут
Кстати ДАВНО хотел написать вот что.

VB.NET
1
2
3
Th2 = Nothing'3
 
Th2_exist = False '1
Почему пользуюсь собственными флагами (Th2_exist).

Потому что проверить наличие объекта в Net-е средствами NET-а НЕВОЗМОЖНО по причине видимо наличия супер умного сборщика мусора. Объект удаляется не тогда КОГДА ПРИКАЗЫВАЮ Я, а тогда когда ЗАХОЧЕТ УБОРЩИК МУСОРА. Поэтому после удаления объекта он некоторое неопределенное время продолжает спокойно себе существовать.

И мне честно говоря не понятно что означает оператор Th2 = Nothing.

Эту фигню я выяснил через неделю после начала освоения NET-а. На Visual FoxPro было все четко.
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
27.11.2015, 21:48
В том что я написал, есть логика для избежания проблем, когда время задержки больше чем обработка. Попробуйте как я написал... Еще в запасе есть 3 вариант.
ПС я с телефона, много писать трудно

Добавлено через 7 минут
Про Th2_exist прекрасно знаю для чего используется, его можно расширенно использовать с небольшой переделкой
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
27.11.2015, 21:48  [ТС]
Вы действительно правы в том, что перед началом остановки потока Th2 надо "обнулить" обслуживаемую процедуру Pic_Refr. Я об этом как-то не подумал.

Переделал свой второй вариант пока так:

VB.NET
1
2
3
4
5
6
7
8
9
10
    Public Sub Pic_Refr()
        System.Threading.Thread.Sleep(g_interval)
 
        If Th2_exist Then
            Tme.Label1.Text = g_mes
 
            Tme.ShowDialog()
        End If    
 
    End Sub

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 Sub Shp2(ByVal Vs As Boolean, Optional ByVal Mes As String = "", Optional ByVal Interval As Integer = 600)
        If g_anim Then
 
            '=================================================================================================='
            '                                      Вариант с анимацией                                         '
            '=================================================================================================='
 
            g_interval = Interval
            g_mes = Mes
 
            If Vs Then
                If Not Th2_exist Then
                    Th2 = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Pic_Refr))
 
                    Th2.Start()
 
                    Th2_exist = True
                End If
            Else
                If Th2_exist Then
                    Th2_exist = False
 
                    Th2.Abort()
                    Th2.Join()
                End If
            End If
        Else
И в процедуре Shp2 (в той ее части, которая закрывает поток) поставил Th2_exist = False перед Th2.Abort()

То есть когда начнет работать Abort, процедура Pic_Refr будет пустой (за исключением Sleep). Это поможет, если прерывание, о котором сообщалось в ошибке, возникало именно в процедуре Pic_Refr.
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
27.11.2015, 22:03
Это переделка первого варианта? Есть сомнения, по поводу него. Второй (включая изменения) или третий считаю надежнее
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
27.11.2015, 23:24  [ТС]
У меня он по счету второй. Взял за основу решение с сайта Microsoft, гле данный способ объявлен потокобезопасным.

Если интересно, вот ссылка https://msdn.microsoft.com/en-... 10%29.aspx
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
28.11.2015, 00:08
Как практика показала - хрен там безопасный. Лучше метод без .abort
1
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
28.11.2015, 01:54  [ТС]
Ладно, посмотрим.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
28.11.2015, 10:30
А если вместо создания потока использовать Me.BeginInvoke()?
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
28.11.2015, 19:36  [ТС]
А если вместо создания потока использовать Me.BeginInvoke()?
Да хорошо бы представленный код переделать под BeginInvoke. Если кто предложит вариант, будет очень хорошо. Только, просьба, отправной точкой брать код из поста #66. Отвлеченных примеров не надо.

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

Была у меня ситуация на Visual FoxPro. Был очень большой проект - несколько тысяч файлов. Запускаю сборку - Fox выдает ошибку. Запускаю повторно - все в порядке. А случалось скорее всего вот что: все файлы, которые входили в состав проекта, видимо антивирус проверял (у меня Kaspersky), вклиниваясь в процесс сборки. И видимо некорректно вклинивался - блокируя файл на время проверки. А Fox этого не мог стерпеть и выдавал ошибку.

Добавлено через 3 минуты
Лучше метод без .abort
И еще.

Может без Thread.Abort и лучше. Но может быть Yuri Komar, утверждающий ЧТО В NET-е ВСЕ ПРОДУМАНО И ПЕРЕДУМАНО - расскажет мне (и всем желающим) как в NET-е корректно останавливать потоки.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
28.11.2015, 21:04
Идеального варианта подходящего под абсолютно все слечаи - НЕТ, вы сами должны это понимать...
Ну а если так уж прям хочется, то можно попробовать использовать BeginInvoke... Но вы наверное быстрее сами начнете делать это. Ведь это ваш проект. Да и, если помните, вам Памирыч в саааамом насале еще предложил вариант сделать через Invoke и даже пример привел, а вы почему-то подумали что это вам не подходит и пошли другим путем, который оказался вроде как и неподходящий вовсе...
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
28.11.2015, 21:24  [ТС]
Да Памирыч приводил пример.

Но во-первых, он запускает два процесса. Сначала один, а из-под него второй - на рефреширование формы. А мне зачем два процесса-то стартовать - и так уже есть основной, в котором программа работает. А потом, оказалось, что все проблемы - при остановке рефреширования, а на эту тему Памирыч ничего не предложил в своем примере. Я имею в виду пост #6.
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
28.11.2015, 23:24  [ТС]
Идеального варианта подходящего под абсолютно все случаи - НЕТ, вы сами должны это понимать...
А мне и не надо под все случаи. У меня же конкретная ситуация - уже вроде со всех сторон понятная и описанная.

А вот создателям Net-а действительно следовало бы думать ОБО ВСЕХ ВОЗМОЖНЫХ СЛУЧАЯХ. И если они включают метод Thread.Abort в состав системы, то он должен работать в любой ситуации. Или во всяком случае в описании все должно быть изложено, как им пользоваться. Но я же говорю, что адаптировал их же примеры. Почему же не работает и к тому же в такой простой ситуации.

Кстати, на MSDN-е кот наплакал про Thread.Abort.
Миниатюры
Воспроизведение GIF в параллельном потоке  
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
03.12.2015, 21:38  [ТС]
Вот, Памирыч, все вроде сделал по Вашему совету:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   Public Sub Shp2(ByVal Vs As Boolean, Optional ByVal Mes As String = "", Optional ByVal Interval As Integer = 600)
        If g_anim Then
            'g_interval = Interval
            'g_mes = Mes
 
            If Vs Then
                System.Threading.Thread.Sleep(200)
 
                If Tme.Pic1.InvokeRequired Then
                    Tme.Pic1.Invoke(New System.Threading.ThreadStart(AddressOf Pic_Refr))
                End If
            Else
                Tme.Hide()
            End If

VB.NET
1
2
3
4
    Public Sub Pic_Refr()
        Tme.Pic1.Refresh()
        Tme.Show()
    End Sub
Полный ноль - и ошибки нет и окно не отображается.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
03.12.2015, 21:51
Ivan215, здесь
VB.NET
1
2
3
If Tme.Pic1.InvokeRequired Then
                    Tme.Pic1.Invoke(New System.Threading.ThreadStart(AddressOf Pic_Refr))
                End If
Добавте условие:
VB.NET
1
2
Else
Pic_Refr
Может поможеь
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
03.12.2015, 21:51
В моем понимании как поток с...
VB.NET
1
2
3
4
    Public Sub Pic_Refr()
        Tme.Pic1.Refresh()
        Tme.Show()
    End Sub
...закончится - форма сразу исчезнет. То есть появится и сразу исчезнет, то есть - то есть вообще её не увидите =)
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
03.12.2015, 21:56
Sklifosofsky прав однако тут диалог вызывать надо... и заменить .Hide на DialogResult.OK
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
03.12.2015, 21:59
Меня немного осенило с инвком... но только с do .... loop опять же
P.S. этот не тот вариант, который я недавно в соседней теме предложил=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2015, 21:59

Выполнение процедуры в параллельном потоке
Простая задача, но у нас параллельного программирования не было и наверное не будет. Есть процедура вида type TPtr=^TPList; ...

Запуск функции в параллельном потоке
Пишу библиотеку работы с графикой на windows.h, для адекватной работы функции создания окна требуется запустить функцию с его созданием и...

Воспроизведение Gif анимации
Как сделать что бы GIF фаил играл, я вставляю а он стоит как картинка...

Воспроизведение gif анимации
Возможно ли воспроизведение gif анимации на java? пробовал прописать так, но я не удивлён что не получилось, моя java-FX же особенная XD ...

Воспроизведение gif-анимации
Добрый день. Не могу воспроизвести анимацию на Delphi 7. Находил статьи в интернете писали, что нужно добавить в uses GifImg, но при запуке...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru