Doevents своими руками

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.03.2013 (Ср) 15:37

arthur2 писал(а): Ага, теперь согласен, для отладки таки нужен EbMode

А кто-нибудь может рассказать, что это такое вообще?

arthur2 писал(а):
Код: Выделить всё
  Do While PeekMessage(MSG, 0&, 0&, 0&, PM_REMOVE)
    If WE_ARE_IN_IDE Then If EbMode = 2 Then DoEvents: Exit Sub

Почему это в цикле?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Doevents своими руками

Сообщение ger_kar » 06.03.2013 (Ср) 16:59

Qwertiy писал(а):А кто-нибудь может рассказать, что это такое вообще?
Кстати да. Я тоже так и не въехал в сокровенный смысл, который несет в себе EbMode, что это такое и вообще для чего оно надо.
И вообще непонятно зачем так извращаться и засовывать проверку на IDE в цикл, и там же запускать DoEvents. На период отладки и работы под IDE достаточно просто запускать стандартный DoEvents вне всякого цикла. Т.е. сделать простую развилку. Проверка на работу под IDE и далее в зависимости от результата - либо цикл прокачки сообщений, либо запуск стандартного DoEvents, безо всяких извращений.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Doevents своими руками

Сообщение arthur2 » 06.03.2013 (Ср) 18:16

EbMode возвращает состояние отладки. Если возвращает 2 - значит отладка в пошаговом режиме.
Если этого не будет, а останов произойдет во время выполнения цикла, будет неслабое зависание. Прием с EbMode, например, очень полезен для безопасной отладки субклассинга или хуков. viewtopic.php?f=51&t=39461
Qwertiy писал(а):Почему это в цикле?
Код: Выделить всё
If WE_ARE_IN_IDE Then If EbMode = 2 Then DoEvents: Exit Sub
Если мы в ИДЕ и отладка происходит в пошаговом режиме, то делаем стандартный дуэвентс и прерываем цикл.
ger_kar писал(а):Проверка на работу под IDE и далее в зависимости от результата - либо цикл прокачки сообщений, либо запуск стандартного DoEvents, безо всяких извращений.
Это если самодельный дуэвентс по поведению ничем не отличается от стандартного. А если он предполагает несколько более сложное поведение (например, выбор эвентсов, которые нужно или ненужно ду), тогда такое поведение тоже нужно отлаживать. Значит развилка на стандартную дуевентс нужна не под ИДЕ, а только под ИДЕ в пошаговом режиме
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 06.03.2013 (Ср) 18:53

arthur2 писал(а):Если мы в ИДЕ и отладка происходит в пошаговом режиме, то делаем стандартный дуэвентс и прерываем цикл.

Ну код я читать и сам умею :)
За счёт того, что оно написано в цикле, мы сначала берём из очереди сообщение, потом проверяем условие и вызываем стандартный DoEvents. Но ведь одно сообщение из очереди мы взяли и на момент вызова стандартного DoEvents его там уже не будет. Почему это правильно?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Doevents своими руками

Сообщение ger_kar » 06.03.2013 (Ср) 19:06

Да, и при любом раскладе проверять работу под IDE в цикле, никакого смысла нет.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Doevents своими руками

Сообщение arthur2 » 06.03.2013 (Ср) 20:15

Qwertiy писал(а):Но ведь одно сообщение из очереди мы взяли и на момент вызова стандартного DoEvents его там уже не будет. Почему это правильно?
Ну в общем да, нужно продублировать и перед циклом. Но вообще-то, оригинальный дуэвентс нужен здесь просто для того, чтобы без зависания перейти в режим пошагового исполнения.
ger_kar писал(а):Да, и при любом раскладе проверять работу под IDE в цикле, никакого смысла нет
То, что мы под иде, проверяется перед циклом. А то, что мы в пошаговом режиме - проверяется в цикле, просто потому, что именно во время работы цикла этот статус может измениться.
Артур
 
   

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Doevents своими руками

Сообщение ger_kar » 06.03.2013 (Ср) 20:27

arthur2 писал(а):Ну в общем да, нужно продублировать и перед циклом. Но вообще-то, оригинальный дуэвентс нужен здесь просто для того, чтобы без зависания перейти в режим пошагового исполнения.
Ну, а почему просто не проверять это перед циклом и в зависимости от этого можно же вызвать оригинальный дуэвентс и цикл вообще не начинать. Тогда в скомпилированном варианте вообще ничего лишнего не будет.
Бороться и искать, найти и перепрятать

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Doevents своими руками

Сообщение arthur2 » 06.03.2013 (Ср) 20:50

arthur2 писал(а):просто потому, что именно во время работы цикла этот статус может измениться.

А в скомпилированном варианте - итак ничего лишнего не будет. Вся ветка If WE_ARE_IN_IDEбудет удалена

Код: Выделить всё
Option Explicit

Public Type MSG
  hwnd As Long
  message As Long
  wParam As Long
  lParam As Long
  time As Long
  pt As POINTAPI
End Type

Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Private Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Private Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long
Private Const PM_REMOVE = &H1

'/////////////в релиз не попадет:
Private Declare Function EbMode Lib "vba6" () As Long
Public Function MakeTrue(ByRef b As Boolean) As Boolean: b = True: MakeTrue = True: End Function
'/////////////

Sub myDoEvents()
'/////////////в релиз не попадет:
  Dim WE_ARE_IN_IDE As Boolean:  Debug.Assert MakeTrue(WE_ARE_IN_IDE) 'фишка от хакера
  If WE_ARE_IN_IDE Then If EbMode = 2 Then DoEvents: Exit Sub
'/////////////
 
  Dim MSG As MSG
  Do While PeekMessage(MSG, 0&, 0&, 0&, PM_REMOVE)
    TranslateMessage MSG
    DispatchMessage MSG
'/////////////в релиз не попадет:
    If WE_ARE_IN_IDE Then If EbMode = 2 Then DoEvents: Exit Sub
'/////////////
  Loop

End Sub
Последний раз редактировалось arthur2 07.03.2013 (Чт) 16:27, всего редактировалось 1 раз.
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.03.2013 (Чт) 13:39

arthur2 писал(а):Ну в общем да, нужно продублировать и перед циклом. Но вообще-то, оригинальный дуэвентс нужен здесь просто для того, чтобы без зависания перейти в режим пошагового исполнения.

Дублирование не избавит от пропуска сообщения. Может, проверку стоит поставить в конце цикла, а не в начале?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.03.2013 (Чт) 13:42

И ещё. Не стоит ли ограничить число итераций цикла?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Doevents своими руками

Сообщение arthur2 » 07.03.2013 (Чт) 16:26

Qwertiy писал(а):Может, проверку стоит поставить в конце цикла, а не в начале?
Собственно, наверное, действительно лучше в конце. Поправил :) Но перед циклом тоже надо - чтобы при пошаговом в цикл вообще не заходило.

А итерации зачем ограничивать? смысл как раз в том, чтобы обработать все сообщения, которые накопились в очереди.
Артур
 
   

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 72

    TopList