1

Тема: AHK: PeekMessage

Господа обращаюсь за советом.
Дело в том, что пытаюсь реализовать программу на AHK с внедренным WebBrowser. Все было хорошо пока не понадобилось вести лог обмена данными через COM-port. Написали dll-библиотеку функций обмена измерительного прибора с компьютером через COM-port и когда есть необходимось вызываем функции обмена и результат размещаем в документе браузера.

Пока идут одиночные команды обмена лог успевает обновляться, как начинаются групповые опросы лог зависает и пока не произойдет окончание групповых опросов окно программы не откликается и лог не обновляется.

Посмотрел в интернете видимо это вызвано тем, что притормаживает очередь сообщений в момент вызова функций DllCall. Решают эту проблемму вызовом PeekMessage. Примерно так:

if(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{

//Ну здесь понятно идет обработка сообщений
if(!GetMessage (&msg, NULL, 0, 0)) break;
TranslateMessage (&msg); 
DispatchMessage (&msg);
}

Подскажите пожалуйста как реализовать такую функцию на AutoHotKey?

Ломаем, разбираем, грызем игрушки!

2

Re: AHK: PeekMessage

А что Вы с ней будете делать? Насколько знаю, скрипт выполняется в один поток. И если этот поток пошёл в Вашу dll, когда Вы вызвали функцию из неё, то пока он оттуда не вернётся при возврате этой функции, никаких других действий в скрипте не будет. Будет выполняться код функции из dll. Код скрипта продолжит выполняться, только когда эта функция отработает.

Распараллелить можно, запустив два скрипта и наладив общение между ними, например, через оконные сообщения. Ну и на официальном форуме в разделе Scripts & Functions есть проект AutoHotkey.dll, где вроде бы реализована многопоточность. Но в это я не вникал.

3

Re: AHK: PeekMessage

YMP пишет:

А что Вы с ней будете делать? Насколько знаю, скрипт выполняется в один поток. И если этот поток пошёл в Вашу dll, когда Вы вызвали функцию из неё, то пока он оттуда не вернётся при возврате этой функции, никаких других действий в скрипте не будет. Будет выполняться код функции из dll. Код скрипта продолжит выполняться, только когда эта функция отработает.

Спасибо что откликнулись. Я очень благодарен вам за многочисленные ответы по этому маленькому, но удобному языку программирования.
Функции из DLL вызываются друг за другом, т.е. есть место, когда поток возвращается в скрипт, прежде чем вызвать следующую функцию. Именно в эти моменты времени можно поставить запросы к очереди сообщений и узнать есть ли сообщения для текущего окна или они все обработаны. Если есть, то прежде чем вызывать следующую функцию из DLL нужно дождаться пока будут отработаны все текущие сообщения окна.

Ломаем, разбираем, грызем игрушки!

4

Re: AHK: PeekMessage

Ну так попробуйте вставить в эти промежутки PeekMessage и посмотреть, есть ли сообщения. Раз Вы вызываете функции из dll, то знаете, как пользоваться DllCall.

Честно говоря, мне пока не понятно, в чём конкретно у Вас проблема. Ведь не может быть, что Вам просто лень писать код и Вы хотите, чтобы кто-то сел и сделал это за Вас.

5

Re: AHK: PeekMessage

YMP пишет:

Честно говоря, мне пока не понятно, в чём конкретно у Вас проблема. Ведь не может быть, что Вам просто лень писать код и Вы хотите, чтобы кто-то сел и сделал это за Вас.

Конечно мне не лень. Видимо просто в синтаксис вкрадывается ошибка и поэтому я получаю неверный результат.

VarSetCapacity(message,4,0)
    loop 5
    {
        if DllCall("PeekMessage", "UInt*", message, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0)
        {            
            sleep 100
            if !DllCall("GetMessage", "UInt*", message, "UInt", 0, "UInt", 0, "UInt", 0)
            {
                DllCall("TranslateMessage", "UInt", &message)
                DllCall("DispatchMessage", "UInt", &message)            
            }
            else
                break
        }
        else
            break
            
    }

Возможно ошибка бросится вам в глаза, но я ее не вижу.

Ломаем, разбираем, грызем игрушки!

6

Re: AHK: PeekMessage

Ну, в общем-то, одна бросается. MSG — это не число, а структура.

typedef struct tagMSG {     // msg  
    HWND   hwnd;     
    UINT   message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD  time; 
    POINT  pt; 
} MSG;

POINT внутри неё тоже структура.

typedef struct tagPOINT { // pt  
    LONG x; 
    LONG y; 
} POINT;

Итого 28 байт, по крайней мере на 32-битной системе.

7

Re: AHK: PeekMessage

YMP пишет:

Итого 28 байт, по крайней мере на 32-битной системе.

Все равно не работает. Видимо буду копать в сторону многопроцессного режима. Или сделаю что-то типа OPC-сервера для работы с COM-портом.
Еще есть вариант с передачей данных между двумя процессами.

Спасибо за участие.

Ломаем, разбираем, грызем игрушки!