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

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

20.11.2015, 22:22. Показов 8823. Ответов 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
23.11.2015, 20:12
Студворк — интернет-сервис помощи студентам
И еще. Там тавтология типа "if ProgressThread Is Nothing..." - это не обязательно, если включение-выключение этого окна происходит в правильном порядке. Это на случай если предполагаются ошибки при обработке данных... Хотя это мало вероятно
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
23.11.2015, 20:22  [ТС]
Вы хоть пробуйте то, что Вам пишут.
Все что для меня приемлемо, я пробую (хоть).

Однако учтите, что основная форма отвечать не будет
Это как понимать? Вообще что ли?

Поэтому и не стал пробовать 10 пост
0
Почетный модератор
 Аватар для Памирыч
23253 / 9167 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
23.11.2015, 20:38
Ivan215, ну как у Вас форма сейчас зависает?
Вот так и будет зависать. С одним лишь отличием, что если сейчас Вы вызовите вторую форму - она так же повиснет, а в моем примере - будет работать и отвечать как ни в чем не бывало.

Ответы даны, остается лишь пробовать. Посты набивать не хочу впустую, за сим вынужден откланяться
1
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
23.11.2015, 20:40  [ТС]
При старте программы поставил вызов

VB.NET
1
Call Sta_Tme_Proc()
VB.NET
1
2
3
4
5
6
    Public Sub Sta_Tme_Proc()
        Dim Th2 As System.Threading.Thread = New System.Threading.Thread(AddressOf Tme_Refr)
 
        Th2.Start()
 
    End Sub
VB.NET
1
2
3
    Public Sub Tme_Refr()
        System.Windows.Forms.Application.Run(Tme)
    End Sub

Получаю в результате ошибку (см. скрин)
Миниатюры
Воспроизведение GIF в параллельном потоке  
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
23.11.2015, 20:46  [ТС]
Sorry, Sklifosovsky, у меня Net 4.0
0
 Аватар для Sklifosofsky
1087 / 917 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
23.11.2015, 20:50
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ivan215, да хоть на 2.5 тоже самое
вот под 4.0
WindowsApplication272.rar
1
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
23.11.2015, 22:49  [ТС]
Спасибо тебе Sklifosofsky, за простое решение. Который раз меня выручаешь!!!

Добавлено через 37 минут
Кому интересно, вот что получилось:

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
    '-----Вспомогательный поток для рефреширования GIF-а
    Public Th2 As System.Threading.Thread
 
    '----Флаг существования потока
    Public Th2_exist As Boolean = False
 
    Public Sub Shp2(ByVal Vs As Boolean, Optional ByVal Mes As String = "")
        If Vs Then
            If Not Th2_Exist Then
                Th2 = New System.Threading.Thread(AddressOf Pic_Refr)
                Th2.Start(Mes)
                
                Th2_Exist = True
            End If
        Else
            If Th2_Exist Then
                Th2.Abort()
                                
                Th2_Exist = False
            End If
        End If
    End Sub
 
 
    Public Sub Pic_Refr(ByVal Mes As Object)
        Tme.Label1.Text = CType(Mes, String)
        Tme.ShowDialog()
        
    End Sub
Добавлено через 7 минут
Sklifosofsky, если будет желание - еще одна вещица осталась.

VB.NET
1
2
3
4
5
        Call Shp2(True, "Идет загрузка текущей выборки ...")
        
        Call Rd_DataSet_From_XML(DTS_GRD, Fnm, True, False, False)
 
        Call Shp2(False)
Проблема в том, что скажем процедура Rd_DataSet_From_XML, или какая другая, иногда выполняется долго, а иногда очень быстро. И если быстро, то происходит КРАЙНЕ НЕ ЭСТЕТИЧНОЕ мелькание формочки с GIF-ом на экране телевизора. Вот если бы можно было отображать формочку через какое-то пороговое время, задаваемое как параметр, ну скажем 0.7 сек, вот было бы совсем хорошо. И соответственно, если интервал времени между Shp2(True) и Shp2(False) меньше порога, то не отображать формочку вовсе.
0
 Аватар для Sklifosofsky
1087 / 917 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
23.11.2015, 23:07
Как-то так
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
    '-----Вспомогательный поток для рефреширования GIF-а
    Public Th2 As System.Threading.Thread
 
    '----Флаг существования потока
    Public Th2_exist As Boolean = False
 
    Public Sub Shp2(ByVal Vs As Boolean, Optional ByVal Mes As String = "", Optional ByVal Interval as Integer=700)
        If Vs Then
            If Not Th2_Exist Then
                Th2 = New System.Threading.Thread(AddressOf Pic_Refr)
                Th2.Start(new Object(){Interval, Mes})
                
                Th2_Exist = True
            End If
        Else
            If Th2_Exist Then
                Th2.Abort()
                                
                Th2_Exist = False
            End If
        End If
    End Sub
 
 
    Public Sub Pic_Refr(ByVal Param As Object)
        Threading.Thread.Sleep(CType(Param(0), Integer))
        Tme.Label1.Text = CType(Param(1), String)
        Tme.ShowDialog()
        
    End Sub
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
24.11.2015, 00:48
У вас обращение к контролам из другого потока. Добавьте при старте программы/главной формы IllegalThreadCalls = True
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
25.11.2015, 03:31  [ТС]
Спасибо, Sklifosofsky, вроде все работает. Только когда не было интервала задержки, при быстрой работе на клавиатуре иногда форма теряла GIF, а иногда вообще программа вылетала в аут.

А как Ваш пример сделать через InvokeRequired?

Добавлено через 23 часа 36 минут
Sklifosofsky, чего-то все-таки не хватает.

Иногда снимается прога:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Подробная информация об использовании оперативной 
(JIT) отладки вместо данного диалогового 
окна содержится в конце этого сообщения.
 
************** Текст исключения **************
System.Threading.ThreadAbortException: Поток находился в процессе прерывания.
   в System.Drawing.SafeNativeMethods.Gdip.GdipImageSelectActiveFrame(HandleRef image, Guid& dimensionID, Int32 frameIndex)
   в System.Drawing.Image.SelectActiveFrame(FrameDimension dimension, Int32 frameIndex)
   в System.Drawing.ImageAnimator.ImageInfo.UpdateFrame()
   в System.Drawing.ImageAnimator.UpdateFrames(Image image)
   в System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
   в System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   в System.Windows.Forms.Control.WmPaint(Message& m)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
 
 
************** Загруженные сборки **************
mscorlib
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18063 built by: FX45RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
A3VB
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///D:/EXPERT_VB/a3vb.exe
----------------------------------------
Microsoft.VisualBasic
    Версия сборки: 10.0.0.0
    Версия Win32: 11.0.50709.17929 built by: FX45RTMREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.34238 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18047 built by: FX45RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18021 built by: FX45RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18060 built by: FX45RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.34234 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.34245 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Data
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.18047 built by: FX45RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
mscorlib.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.1 (RTMRel.030319-0100)
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Numerics
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.17929 built by: FX45RTMREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
System.Windows.Forms.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
 
************** Оперативная отладка (JIT) **************
Для подключения оперативной (JIT) отладки файл .config данного
приложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.
 
Например:
 
<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>
 
При включенной отладке JIT любое необрабатываемое исключение
пересылается отладчику JIT, зарегистрированному на данном компьютере,
вместо того чтобы обрабатываться данным диалоговым окном.
Добавлено через 39 минут
Вот один из советов отцов-основателей:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' This event handler creates a thread that calls a
' Windows Forms control in a thread-safe way.
Private Sub setTextSafeBtn_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles setTextSafeBtn.Click
Me.demoThread = New Thread( _
New ThreadStart(AddressOf Me.ThreadProcSafe))
Me.demoThread.Start()
End Sub
VB
' This method is executed on the worker thread and makes
' a thread-safe call on the TextBox control.
Private Sub ThreadProcSafe()
Me.SetText("This text was set safely.")
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    '=================================================================================================='
    '                                            SUBROUTINE                                            ' 
    '                                 Окно сообщающее о ходе процесса                                  '
    '=================================================================================================='
    Public Sub Shp2(ByVal Vs As Boolean, Optional ByVal Mes As String = "", Optional ByVal Interval as Integer = 800)
        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.Abort()
                    My.Application.DoEvents()
     
                    Th2_exist = False
                End If
            End If
        Else  
 
            '=================================================================================================='
            '                                    Вариант без анимации                                          '
            '=================================================================================================='
 
            If Vs Then
                Tme.Label1.Text = Mes
            
                Tme.Show()
                My.Application.DoEvents()
            Else
                Tme.Hide()
                My.Application.DoEvents()
            End If
        End If
    End Sub
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
    '=================================================================================================='
    '                                            PROCEDURE                                             ' 
    '                               Рефреширование формы в новом потоке                                '
    '=================================================================================================='
 
    Public Sub Pic_Refr()
        System.Threading.Thread.Sleep(g_interval)
        Tme.Label1.Text = g_mes
 
        Tme.ShowDialog()
 
    End Sub
Добавлено через 6 минут
В общем, почти то же самое, что Памирыч предлагал:

VB.NET
1
2
3
If PictureBox1.InvokeRequired Then
            PictureBox1.Invoke(New ThreadStart(AddressOf ForPB))
        End If
Вот только у Памирыча непонятно, как новый поток называется - просто New стоит и все.

Я видел примеры на C# где в Invoke по несколько команд засовывают, вот только не просеку, как это будет выглядеть на VB.

А в моем случае в Invoke надо засунуть 3 команды:

VB.NET
1
2
3
4
5
    Th2 = New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Pic_Refr))
                    
    Th2.Start()
 
    Th2_exist = True
Добавлено через 5 минут
Не-а. И последний вариант глючит - вылетает программа - по тому же исключению.

System.Threading.ThreadAbortException: Поток находился в процессе прерывания.
Видать и у отцов основателей протекает IQ.

Добавлено через 1 час 18 минут
Вот так вроде не вешается ПОКА:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            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.Abort()
                    Th2.Join()
     
                    Th2_exist = False
                End If
            End If
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
25.11.2015, 07:14
Ненадо принудительно выгружать поток через Abort. После отработки функции вашей - поток выгрузится сам а вы его еще допоонительно во время выгрузки пытаетесь выгрузить.
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
25.11.2015, 17:14  [ТС]
Не понял. Как это он выгрузится? В некоторый ОПРЕДЕЛЕННЫЙ момент надо остановить анимацию и убрать форму с экрана. Если точнее, в момент окончания работы процедуры Call Rd_DataSet_From_XML. С какого бодуна второй поток остановится именно в этот момент САМ?

Нельзя ли по подробнее.

То есть, если я Вас правильно понял вызов

VB.NET
1
    Call Shp2(False)
Вообще не нужен?

Добавлено через 42 минуты
Yury Komar, у меня к Вам просьба. Уверен, Вы владеете кроме русского языка еще и VB.NET (и наверняка лучше меня). Не могли бы Вы отвечать еще и с помощью кода, а не только по-русски. Я привел последний вариант процедуры. Вроде все подробно как мог объяснил. Если Вы считаете что что-то не нужно, приведите откорректированный ПРАВИЛЬНЫЙ текст процедуры, убрав все то что не нужно. А так Ваши замечания имеют весьма малую (для меня) ценность вследствие малоинформативности.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
25.11.2015, 18:17
К сожалению студии нет сейчас и проверенный код не могу выложить, поэтому только делюсь своими мыслями по поводу проблемы, как будет возможность - обязательно выложу код.
А насчет выгрузки потока - я имел ввиду прерывание выполнения процедуры в созданном потоке. Как только метод достиг End Sub - поток выгружается, а ваше исключение гласит о том что что-то пытается принудительно прервать выполнение потока как раз в момент, когда выполняется автоматическое прерывание и выгрузка... Это мои догадки и я почему-то уверен что это принудительное закрытие потока вызывается в вашем коде через .ABORT, что и есть принудитьльное прерывание потока, и у вас оно синхронно с автоматическим прерывание в конце процедуры.
Прошу прощения за то что не могу выложить сейчас код... но, если есть желание, то попробуйте убрать или закомментировать строки кода где вызывается принудителтное прерывание потока ".abort" и проверьте будет ли это исключение повторяться?

Добавлено через 8 минут
А насчет
Вот только у Памирыча непонятно, как новый поток называется - просто New стоит и все.
Invoke вроде бы где-то за кулисами сам создает поток и выполняет нужную процедуру в нем. Поэтому название потока вам и не доступно. По окончании выполнения процедуры поток выгружается автоматически.
1
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
25.11.2015, 18:21  [ТС]
Я уже пробовал убрать фрагмент

VB.NET
1
2
3
4
5
6
If Th2_exist Then
    Th2.Abort()
    Th2.Join()
     
    Th2_exist = False
End If
Программа начинает работать неправильно.

Как только метод достиг End Sub
Можно поподробнее - какой именно метод и конец какой процедуры Вы имеете в виду.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
25.11.2015, 18:28
А какую процедуру вы выполняете в отдельном потоке вы хоть догадались сами?

Наверное эту?
VB.NET
1
Public Sub Pic_Refr(ByVal Param As Object)
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
25.11.2015, 18:33  [ТС]
Дело в том, что анимация работает (а следовательно и поток) ДО ТЕХ ПОР, ПОКА не выполнится вызов

VB.NET
1
    Call Shp2(False)
Именно этот вызов и останавливает поток и анимацию. Это по моим понятиям. В противном случае я вообще не понимаю как управлять остановкой процесса анимации.

Предположение же о том, что поток останавливатеся САМ в момент окончания процедуры Rd_DataSet_From_XML мне кажется странным. Процедура работвет в основном потоке, после ее окончания программа продолжает дальше работать и делать свои дела. Почему анимация должна САМА в этот момент остановиться - совершенно непонятно.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
25.11.2015, 18:37
Вообще-то вы не запускаете процедуру Rd_DataSet_From_XML в отдельном потоке, а следовало ьы, на что я вам в первых своих постах и указывал, вы начали вертеть носом и говорить что таких еще десятки штук и проблемно будет это осуществить. Поэтому и отказались от запуска этой процедуры в ОТДЕЛЬНОМ от основного потоке... и поэтому речь об этой процедуре прекратилась и все переключились на на вызов процедуры открытия формы с гифкой в отдельном потоке...
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
25.11.2015, 18:46  [ТС]
Вот процедура, запускаемая во вспомогательном потоке:

VB.NET
1
2
3
4
5
6
7
    Public Sub Pic_Refr()
        System.Threading.Thread.Sleep(g_interval)
        Tme.Label1.Text = g_mes
 
        Tme.ShowDialog()
 
    End Sub
Видите стоит вызов метода ShowDialog

Читаю MSDN:

Этот метод можно использовать для отображения модального диалогового окна в приложении. При вызове этого метода код, следующий за ним, не выполняется до тех пор, пока диалоговое окно не будет закрыто.
Следовательно, до End Sub выполнение НЕ ДОЙДЕТ НИКОГДА, и единственный способ в данной ситуации остановить анимацию - это принудительно остановить поток - что и происходит при вызове Call Shp2(False).

Или я что-то не так понимаю?

Добавлено через 2 минуты
вы начали вертеть носом
Давайте общаться так сказать в рамках.

Мое мнение следующее. Что запускать и в каком потоке не имеет никакого значения (по причине симметрии) в том случае, если многопоточность работает НАДЕЖНО. В чем у меня есть теперь все основания сомневаться.
1
 Аватар для Sklifosofsky
1087 / 917 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.11.2015, 19:09
Вот ща тролю свой код, ни как не могу выбить. Все норм.
А почему отказались от передачи объекта в процедуру запуска формы?

Добавлено через 21 минуту
Все понял почему выбивает.
Причем тут 2 случая.
1. Прорисовка идет свои потоком. Когда время задержки почти ровняется времени обработки данных, происходит нелепая ситуация, команда на отображение окна поступает, но на прерывании прорисовка не успевает завершиться и бац...
2. Ошибка произойдет если мышью схватить окно и при завершении потока произойдет ошибка.

Буду думать
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
25.11.2015, 19:14
Ivan215, до End Sub какраз таки доходит в момент простого закрытия формы ну или принудительного... а исключение вываливается до закрытия формы? Тоесть до выполнения shp2(False)?

Добавлено через 1 минуту
Често я б с радостью тоже поковырялся с этой проблемой на практике, вот только беда - не могу студии нет под рукой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2015, 19:14

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №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 — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru