Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор терминала типа VT52 (http://zx-pk.ru/showthread.php?t=20092)

Titus 2nd January 2013 05:03

Что-то с хуками все же не чисто.

Все работает, но, когда переключаюсь с эмуляторного окна на окно консоли (которое у меня информационно-отладочное), все жутко начинает тормозить. Даже если в обработчике хука стоит просто переход по цепочке на следующий хук. Убираю хук - все работает быстро.
Пока что загадка.

Patron 2nd January 2013 13:32

Quote:

Originally Posted by Titus (Post 563839)
все жутко начинает тормозить

Это проблема реализации. Может быть связано с тем, что сообщения об утрате фокуса прежним окном и получении фокуса новым окном приходят в эти окна в произвольной последовательности относительно друг друга.

Titus 2nd January 2013 14:00

Quote:

Originally Posted by Patron (Post 563875)
Это проблема реализации. Может быть связано с тем, что сообщения об утрате фокуса прежним окном и получении фокуса новым окном приходят в эти окна в произвольной последовательности относительно друг друга.

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

Patron 2nd January 2013 14:19

Quote:

Originally Posted by Titus (Post 563892)
все равно тормозит.

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

Titus 2nd January 2013 14:37

Quote:

Originally Posted by Patron (Post 563898)
Чудес не бывает - комп тормозит тогда, когда что-то делает. Можно вставить в хук отладочную печать на экран консоли - сообщения должны появляться только при нажатиях на клавиши.

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

Patron 2nd January 2013 15:05

Quote:

Originally Posted by Titus (Post 563901)
Мне все же кажется, что это накладки из-за того, что хук не в длл. Попробую выяснить.

Быть такого не может - между EXE и DLL нет практически ни какой разницы. Скорее - там где-то Sleep( x ) всех спать отправляет.

---------- Post added at 13:05 ---------- Previous post was at 12:47 ----------

Разборщик сообщений в хук-тесте выглядит так:
Code:

        dword uTC = GetTickCount();
       
        MSG      msg;
        for(;;)
        {
                if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
                {
                        TranslateMessage( &msg );
                        DispatchMessage( &msg );
                        if( msg.message == WM_QUIT ) break;
                }

                Sleep(1);

                if( GetTickCount() - uTC > 20000 ) { break; }
        };

Строчка Sleep(1); применена для того, чтобы не отбирать у процессора слишком много времени.

Но при этом - разборщик не может обработать больше 1000 сообщений в секунду. Если сообщений будет приходить больше ( что в данном тесте полностью исключено ) - сообщения перестанут обрабатываться в реальном времени и всё начнёт дико тормозить.

Titus 2nd January 2013 15:17

Выяснил, где у меня подтормаживает.

Code:

        if (PeekMessage(&msg, NULL, 0, 0, 0)) {
                if (GetMessage(&msg, NULL, 0, 0)) {                // Получить сообщение
                        TranslateMessage(&msg);                                // Если сообщение не QUIT,
                        DispatchMessage(&msg);                                // оттранслировать его окну
                }
                else        SysExit();                                                // Иначе выйти закрыв все устройства
        }

При отладке дебаггером, тормозят две строчки PeekMessage и GetMessage. Причем ТОЛЬКО если есть хук, даже пустой, установленный моей программой. Тормозят где-то по 2-3 секунды каждая, потом программа идет далее.

---------- Post added at 14:15 ---------- Previous post was at 14:09 ----------

Думаю, что дело в хуке.

В режиме, когда подвисают PeekMessage и т.д. (а это когда активно консольное окно эмулятора), функция хука, хотя и установлена, ПЕРЕСТАЕТ работать. Это определяется просто - печатаю в специальное окно сообщение 'Hool action', когда хук вызывается. Так вот в этом режиме оно перестает печататься. Это значит, что функция хука пропадает, и возможно на ней все и подвисает.

---------- Post added at 14:17 ---------- Previous post was at 14:15 ----------

Обработчик хука таков:

Code:

LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{

        printf("Hook action\n");

        return CallNextHookEx(hhKeyboardHook, nCode, wParam, lParam);
}

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

Инициализация хука такая:

Quote:

hhKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHook, hInst, 0); // Установить глобальный хук клавиатуры

Patron 2nd January 2013 15:19

Quote:

Originally Posted by Titus (Post 563910)
Code:

        if (PeekMessage(&msg, NULL, 0, 0, 0)) {
                if (GetMessage(&msg, NULL, 0, 0)) {                // Получить сообщение
                        TranslateMessage(&msg);                                // Если сообщение не QUIT,
                        DispatchMessage(&msg);                                // оттранслировать его окну
                }
                else        SysExit();                                                // Иначе выйти закрыв все устройства
        }


То же самое можно сделать проще:
Code:

        if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
                if ( msg.message != WM_QUIT )
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        SysExit();
                }
        }


Titus 2nd January 2013 15:24

Quote:

Originally Posted by Patron (Post 563917)
То же самое можно сделать проще

Это не проще, и сути проблемы не меняет)

Patron 2nd January 2013 15:26

Я ни разу не пользовался отладчиком и компилю всегда сразу в Release, поэтому (возможно) с описанными проблемами ни разу не столкнулся.

---------- Post added at 13:26 ---------- Previous post was at 13:24 ----------

Quote:

Originally Posted by Titus (Post 563919)
Это не проще

Проще ровно в 2 раза ( сообщение извлекается из очереди за один вызов, а не за два ).


All times are GMT +4. The time now is 02:41.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.