Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
"Физически": PeekMesage проверяет, есть ли сообщение в очереди, и если есть, то извлекает его (PM_REMOVE). TranslateMessage анализирует сообщения WM_KEYDOWN на предмет нажатия символьных клавиш и транслирует их в сообщения WM_CHAR (добавляет в очередь). DspatchMessage вызывает процедуру окна, которому адресовано сообщение. В итоге этот цикл обрабатывает все сообщения, имеющиеся\накопившиеся в очереди с момента предыдущего вызова |
Автор: B.V. 07.03.13, 08:36 |
Не все, а только те, которые адресованы какому-то окну. |
Автор: leo 08.03.13, 09:40 |
"Один пишем, два в уме"? К чему относится это замечание? Если в PeekMessage параметр hWnd = NULL (как в #2), то из очереди извлекаются сообщения, адресованные всем окнам потока (в том числе и thread message c hWnd=NULL) |
Автор: B.V. 11.03.13, 11:11 |
К тому, что утверждение не совсем корректно. Сообщения для потока будут благополучно теряться Цитата 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 |
|
Автор: salieri 25.06.20, 21:58 |
Всем спасибо большое! Сообщения были разделены в тему "Флуд" |