Страница: 1 |
Страница: 1 |
Вопрос: Вопрос корифеям
Добавлено: 22.03.08 20:33
Автор вопроса: borman
В одной форме есть два TextBox-а.На событие change каждого из них написан свой код. Время обработки события примерно 3 с.
Произошло событие change1 - включилась обработка.
Через 1с. произошло событие change2
Вопрос: Могут ли в события обрабатыватся параллельно, или обработка события change2 не начнется пока не закончится обработка события change1
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #1
Добавлено: 22.03.08 22:04
____ И там и там надо вставить обработку событий (в VBA это DoEvents).
Номер ответа: 2
Автор ответа:
borman
Вопросов: 2
Ответов: 6
Профиль | | #2
Добавлено: 23.03.08 11:11
Подробнее можно?
Номер ответа: 3
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #3
Добавлено: 23.03.08 12:03
Вопрос оказался несколько сложнее, чем на первый взгляд.
Общая идея примерно такая:
'
Private boTB1 As Boolean
Private boTB2 As Boolean
'
' Здесь переменные процедуры Swi()
'
Private Sub TextBox1_Change()
If boTB1 Then Exit Sub ' Блокировка событий во время обработки.
' Здесь начальная установка переменных процедуры Swi для TextBox1.
boTB1 = True
Swi
End Sub
'
Private Sub TextBox2_Change()
If boTB2 Then Exit Sub ' Блокировка событий во время обработки.
' Здесь начальная установка переменных процедуры Swi для TextBox2.
boTB2 = True
Swi
End Sub
'
Private Sub UserForm_Initialize()
boTB1 = False
boTB2 = False
' Здесь общая начальная установка переменных процедуры Swi.
End Sub
'
Public Sub Swi()
Do
If boTB1 Then
' Здесь обработка порции информации по TextBox1.
' Если конец обработки то boTB1 = false
End If
If boTB2 Then
' Здесь обработка порции информации по TextBox1.
' Если конец обработки то boTB2 = false
End If
DoEvents ' Обработка других событий.
Loop While boTB1 Or boTB2
End Sub
За работоспособность не ручаюсь — только идея.
Номер ответа: 4
Автор ответа:
borman
Вопросов: 2
Ответов: 6
Профиль | | #4
Добавлено: 23.03.08 15:11
Спасибо.Посмотрю чем это мне сможет помочь.
Хотя честно говоря меня больше интересует теоретическая возможность языка обрабатывать события параллельно.
Номер ответа: 5
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #5
Добавлено: 23.03.08 16:04
Параллельная обработка может быть возможностью только самой машины — два ядра и более и уж потом — возможностью операционной системой и языка. Поэтому параллельность может быть только псевддо.
В привёдённом примере начинается обработка одно комбобокса и периодически проверяется наличие события у второго. Как только появляется событие у второго, происходит повторный вход в процедуру Swi() и продолжается обработка уже двух событий попеременно порциями у каждого комбобокса. Когда обе обработки закончатся — произойдёт выход из Swi и сразу ещё один выход из неё же по входу в первый раз. Своего рода рекурсия.
____ Про одновременность работы двух участков кода можете забыть до лучших времён.
Номер ответа: 6
Автор ответа:
borman
Вопросов: 2
Ответов: 6
Профиль | | #6
Добавлено: 23.03.08 17:11
"Про одновременность работы двух участков кода можете забыть до лучших времён. ".....
Спасибо. Именно этл я и хотел узнать. А с кодом повожусь, может что и получится. Главное понятна идея и направление...
Номер ответа: 7
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #7
Добавлено: 24.03.08 01:11
Пиши на .NET, там многопоточность - обычное дело.
Номер ответа: 8
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #8
Добавлено: 24.03.08 01:37
многопоточность на VB это действительно отдельная беда!
Номер ответа: 9
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #9
Добавлено: 24.03.08 01:53
Только вот непонятно, что автора интересует — действительная многопоточность или просто удобство языка, который скрывает всевдомногопоточность?
А есть ли сейчас операционки и версии .NET, которые действительно могут распределять между двумя процессорами или это только возможности "больших машин"?
Номер ответа: 10
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #10
Добавлено: 24.03.08 02:14
Скорее это вопрос к ОС
Номер ответа: 11
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #11
Добавлено: 24.03.08 02:20
А вообще, DoEvents это относится к обработке событий системы (например: прорисовка окна). В VBA же всего-навсего один процессор! пока работает один код(процедура) параллельная обработка другой невозможна обычными средствами VBA!
Номер ответа: 12
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #12
Добавлено: 24.03.08 02:34
Удобство языка, всевдомногопоточность....
Бугогогога!
Удобство языка, который "скрывает всевдомногопоточность" невозможно сравнить с удобством языка, который имеет самую настоящую реальную многопоточность и помимо этого имеет еще очень много других возможностей!
Они есть. И были уже давно.
Это возможности не больших машин. Это возможности компьютеров, в которых установлен многоядерный процессор, или вообще несколько процессоров.
По сути несколько ядер/процессоров не нужны в задаче в которой нужно параллельно работе основного интерфейса выполнять какой-то длительный процес без блокирования интерфейса, с этим отлично справится и одно ядро.
Номер ответа: 13
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #13
Добавлено: 24.03.08 09:58
DoEvents в моём примере стоит для того, чтобы поймат событие от второго бокса и обеспечить повторный вход в Swi() и таким образом обеспечить псевдопараллельность процесса.
При наличии двух ядер сама ОС распределяет только задачи. Для распределения процесса внутри задачи как раз и необходимы средства Языка.
Номер ответа: 14
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #14
Добавлено: 24.03.08 11:43
Задачи здесь не причем
Речь идет о потоках.
Для того чтоб в процесе выполнялось несколько операций параллельно, нужно запустить несколько потоков, средства Языка здесь не причем, это делается с помощью Win32API (CreateThread и другие функции, которыми выполняется управлением потока). Либо могут использоваться различные обертки над этими функциями, как, например, в .NET это System.Threading.
Номер ответа: 15
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #15
Добавлено: 24.03.08 12:43
Согласен. Я с терминологией путаюсь. Я же старый очень.