Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual Basic: Общие вопросы > Аналог DoEvents на API


Автор: salieri 17.02.13, 05:54
Доброго времени суток! Подскажите, пожалуйста, как мне команду DoEvents заменить API-функциями, т.е. какие API-функции надо использовать, чтобы получить тот же эффект, что и при DoEvents?

Автор: Filka 17.02.13, 07:25
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Private Declare Function TranslateMessage Lib "user32.dll" (ByRef lpMsg As MSG) As Long
    Private Declare Function DispatchMessage Lib "user32.dll" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Long
    Private Declare Function PeekMessage Lib "user32.dll" Alias "PeekMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Const PM_REMOVE As Long = &H1
     
    Private Type POINTAPI
      x As Long
      y As Long
    End Type
     
    Private Type MSG
      hwnd As Long
      message As Long
      wParam As Long
      lParam As Long
      time As Long
      pt As POINTAPI
    End Type
     
    Private Sub MyDoEvents()
      Dim AMsg As Msg
      Do While PeekMessage(AMsg, 0&, 0&, 0&, PM_REMOVE)
        TranslateMessage AMsg
        DispatchMessage AMsg
      Loop
    End Sub

Автор: salieri 17.02.13, 07:57
Filka, спасибо, буду пробовать!

Автор: Mikle 17.02.13, 09:50
Filka, только DoEvents в VB6 - это функция, возвращающая число загруженных форм в проекте.

Автор: salieri 17.02.13, 10:27
Mikle, мне надо, чтобы при обработке сложной продолжительной задачи программа выводила на экран прогресс, например, выполнено 15%, а не повисала.

Автор: mamonoff 18.02.13, 02:19
А зачем аналог DoEvents? Чем плоха стандартная процедура?
Объясните пожалуйста ни разу не грамотному :)

Автор: salieri 18.02.13, 06:35
mamonoff, я хочу сравнить скорость выполнения команды DoEvents и собственной функции. И так, в принципе, неплохо было бы знать, как это всё устроено!

Автор: Артур 18.02.13, 06:40
http://bbs.vbstreets.ru/viewtopic.php?f=1&t=41820

Добавлено
Цитата mamonoff @
А зачем аналог DoEvents? Чем плоха стандартная процедура?
Объясните пожалуйста ни разу не грамотному

По моей ссылке - есть как раз обсуждение этого

Автор: salieri 18.02.13, 10:03
Артур, спасибо!

Автор: Seriy-Coder 22.02.13, 08:56
Вот тебе и тест.


На API процентов на 20 быстрее у меня на компе выполняется.
DoeventsAPI.rar (, : 615)

Автор: salieri 28.02.13, 19:57
Seriy-Coder, спасибо большое!

Автор: salieri 05.03.13, 13:49
Граждане, объясните, пожалуйста, как физически работает этот цикл.

Автор: leo 05.03.13, 20:20
Цитата salieri @
Граждане, объясните, пожалуйста, как физически работает этот цикл

"Физически":
PeekMesage проверяет, есть ли сообщение в очереди, и если есть, то извлекает его (PM_REMOVE).
TranslateMessage анализирует сообщения WM_KEYDOWN на предмет нажатия символьных клавиш и транслирует их в сообщения WM_CHAR (добавляет в очередь).
DspatchMessage вызывает процедуру окна, которому адресовано сообщение.
В итоге этот цикл обрабатывает все сообщения, имеющиеся\накопившиеся в очереди с момента предыдущего вызова

Автор: B.V. 07.03.13, 08:36
Не все, а только те, которые адресованы какому-то окну.

Автор: leo 08.03.13, 09:40
Цитата B.V. @
Не все, а только те, которые адресованы какому-то окну.

"Один пишем, два в уме"? ;)
К чему относится это замечание?
Если в PeekMessage параметр hWnd = NULL (как в #2), то из очереди извлекаются сообщения, адресованные всем окнам потока (в том числе и thread message c hWnd=NULL)

Автор: B.V. 11.03.13, 11:11
Цитата leo @
К чему относится это замечание?

К тому, что утверждение
Цитата leo @
цикл обрабатывает все сообщения

не совсем корректно. Сообщения для потока будут благополучно теряться
Цитата MSDN
As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function. Therefore, if the recipient thread is in a modal loop (as used by MessageBox or DialogBox), the messages will be lost.

Автор: leo 11.03.13, 14:26
Цитата B.V. @
не совсем корректно. Сообщения для потока будут благополучно теряться

:yes:

Автор: salieri 25.06.20, 21:58
Всем спасибо большое!

Сообщения были разделены в тему "Флуд"

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)