Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.187.121] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Доброго времени суток! Подскажите, пожалуйста, как мне команду DoEvents заменить API-функциями, т.е. какие API-функции надо использовать, чтобы получить тот же эффект, что и при DoEvents?
|
Сообщ.
#2
,
|
|
|
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 |
Сообщ.
#3
,
|
|
|
Filka, спасибо, буду пробовать!
|
Сообщ.
#4
,
|
|
|
Filka, только DoEvents в VB6 - это функция, возвращающая число загруженных форм в проекте.
|
Сообщ.
#5
,
|
|
|
Mikle, мне надо, чтобы при обработке сложной продолжительной задачи программа выводила на экран прогресс, например, выполнено 15%, а не повисала.
|
Сообщ.
#6
,
|
|
|
А зачем аналог DoEvents? Чем плоха стандартная процедура?
Объясните пожалуйста ни разу не грамотному |
Сообщ.
#7
,
|
|
|
mamonoff, я хочу сравнить скорость выполнения команды DoEvents и собственной функции. И так, в принципе, неплохо было бы знать, как это всё устроено!
|
Сообщ.
#8
,
|
|
|
http://bbs.vbstreets.ru/viewtopic.php?f=1&t=41820
Добавлено Цитата mamonoff @ А зачем аналог DoEvents? Чем плоха стандартная процедура? Объясните пожалуйста ни разу не грамотному По моей ссылке - есть как раз обсуждение этого |
Сообщ.
#9
,
|
|
|
Артур, спасибо!
|
Сообщ.
#10
,
|
|
|
Вот тебе и тест.
На API процентов на 20 быстрее у меня на компе выполняется. Прикреплённый файлDoeventsAPI.rar (1,96 Кбайт, скачиваний: 613) |
Сообщ.
#11
,
|
|
|
Seriy-Coder, спасибо большое!
|
Сообщ.
#12
,
|
|
|
Граждане, объясните, пожалуйста, как физически работает этот цикл.
|
Сообщ.
#13
,
|
|
|
Цитата salieri @ Граждане, объясните, пожалуйста, как физически работает этот цикл "Физически": PeekMesage проверяет, есть ли сообщение в очереди, и если есть, то извлекает его (PM_REMOVE). TranslateMessage анализирует сообщения WM_KEYDOWN на предмет нажатия символьных клавиш и транслирует их в сообщения WM_CHAR (добавляет в очередь). DspatchMessage вызывает процедуру окна, которому адресовано сообщение. В итоге этот цикл обрабатывает все сообщения, имеющиеся\накопившиеся в очереди с момента предыдущего вызова |
Сообщ.
#14
,
|
|
|
Не все, а только те, которые адресованы какому-то окну.
|
Сообщ.
#15
,
|
|
|
Цитата B.V. @ Не все, а только те, которые адресованы какому-то окну. "Один пишем, два в уме"? К чему относится это замечание? Если в PeekMessage параметр hWnd = NULL (как в #2), то из очереди извлекаются сообщения, адресованные всем окнам потока (в том числе и thread message c hWnd=NULL) |