Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Вопрос корифеям Добавлено: 22.03.08 20:33  

Автор вопроса:  borman
В одной форме есть два TextBox-а.На событие change каждого из них написан свой код. Время обработки события примерно 3 с.

Произошло событие change1 - включилась обработка.
Через 1с. произошло событие change2

Вопрос: Могут ли в события обрабатыватся параллельно, или обработка события change2 не начнется пока не закончится обработка события change1

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #1
Добавлено: 22.03.08 22:04
____ И там и там надо вставить обработку событий (в VBA это DoEvents).

Ответить

Номер ответа: 2
Автор ответа:
 borman



Вопросов: 2
Ответов: 6
 Профиль | | #2 Добавлено: 23.03.08 11:11
Подробнее можно?

Ответить

Номер ответа: 3
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #3
Добавлено: 23.03.08 12:03
    Вопрос оказался несколько сложнее, чем на первый взгляд. :)
    Общая идея примерно такая:
Option Explicit
'
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-сайт: www.adsemenov.ru
 Профиль | | #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(A) это действительно отдельная беда!

Ответить

Номер ответа: 9
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #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
Только вот непонятно, что автора интересует — действительная многопоточность или просто удобство языка, который скрывает всевдомногопоточность?

Удобство языка, всевдомногопоточность....
Бугогогога!

Удобство языка, который "скрывает всевдомногопоточность" невозможно сравнить с удобством языка, который имеет самую настоящую реальную многопоточность и помимо этого имеет еще очень много других возможностей!

А есть ли сейчас операционки и версии .NET, которые действительно могут распределять между двумя процессорами или это только возможности "больших машин"?

Они есть. И были уже давно.

Это возможности не больших машин. Это возможности компьютеров, в которых установлен многоядерный процессор, или вообще несколько процессоров.

По сути несколько ядер/процессоров не нужны в задаче в которой нужно параллельно работе основного интерфейса выполнять какой-то длительный процес без блокирования интерфейса, с этим отлично справится и одно ядро.

Ответить

Номер ответа: 13
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #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-сайт: www.adsemenov.ru
 Профиль | | #15
Добавлено: 24.03.08 12:43
    Согласен. Я с терминологией путаюсь. Я же старый очень.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам