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

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

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

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

Поэтому и не стал пробовать 10 пост
0
Почетный модератор
 Аватар для Памирыч
23251 / 9165 / 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
1086 / 916 / 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
1086 / 916 / 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
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
25.11.2015, 19:09
Вот ща тролю свой код, ни как не могу выбить. Все норм.
А почему отказались от передачи объекта в процедуру запуска формы?

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

Буду думать
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
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
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru