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

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

20.11.2015, 22:22. Показов 8836. Ответов 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
1087 / 917 / 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
1087 / 917 / 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
1087 / 917 / 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
1087 / 917 / 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
1087 / 917 / 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
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
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
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
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
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
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
1087 / 917 / 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
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
03.12.2015, 21:56
Sklifosofsky прав однако тут диалог вызывать надо... и заменить .Hide на DialogResult.OK
0
 Аватар для Sklifosofsky
1087 / 917 / 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
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru