User Tag List

Показано с 1 по 10 из 1003

Тема: Эмулятор терминала типа VT52

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,806
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Мне все же кажется, что это накладки из-за того, что хук не в длл. Попробую выяснить.
    Быть такого не может - между EXE и DLL нет практически ни какой разницы. Скорее - там где-то Sleep( x ) всех спать отправляет.

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

    Разборщик сообщений в хук-тесте выглядит так:
    Код:
    	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 сообщений в секунду. Если сообщений будет приходить больше ( что в данном тесте полностью исключено ) - сообщения перестанут обрабатываться в реальном времени и всё начнёт дико тормозить.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,402
    Спасибо Благодарностей отдано 
    1,703
    Спасибо Благодарностей получено 
    2,223
    Поблагодарили
    875 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

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

    Код:
    	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 ----------

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

    Код:
    LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
    {
    
    	printf("Hook action\n");
    
    	return CallNextHookEx(hhKeyboardHook, nCode, wParam, lParam);
    }
    Подвисает при активном консольном окне хоть с со строчкой printf, хоть без нее. И прекрасно работает при переключении на окно эмулятора.

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

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

  4. #3

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,806
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Код:
    	if (PeekMessage(&msg, NULL, 0, 0, 0)) {
    		if (GetMessage(&msg, NULL, 0, 0)) {		// Получить сообщение
    			TranslateMessage(&msg);				// Если сообщение не QUIT,
    			DispatchMessage(&msg);				// оттранслировать его окну
    		}
    		else 	SysExit();						// Иначе выйти закрыв все устройства
    	}
    То же самое можно сделать проще:
    Код:
    	if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    	{
    		if ( msg.message != WM_QUIT )
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    		else
    		{
    			SysExit();
    		}
    	}

  5. #4

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,402
    Спасибо Благодарностей отдано 
    1,703
    Спасибо Благодарностей получено 
    2,223
    Поблагодарили
    875 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    То же самое можно сделать проще
    Это не проще, и сути проблемы не меняет)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. [Аукционъ] Клавиатура от терминала ЕС-7927
    от BYTEMAN в разделе Барахолка (архив)
    Ответов: 18
    Последнее: 15.05.2012, 14:50
  2. Срочно ищу монитор от терминала 15ИЭ-00-013 (от ДВК-2)
    от dk_spb в разделе Барахолка (архив)
    Ответов: 1
    Последнее: 10.02.2012, 10:19
  3. Куплю клавиатуру КМ-035 для терминала СМ 7238
    от Kronshou в разделе Барахолка (архив)
    Ответов: 5
    Последнее: 13.09.2010, 23:33
  4. C64 или C128 в качестве терминала под Linux
    от Vinnny в разделе Commodore 16/64/128
    Ответов: 6
    Последнее: 14.12.2007, 16:39
  5. Подгрузка pc-файла типа "codes" в эмулятор
    от maximk в разделе Эмуляторы
    Ответов: 15
    Последнее: 13.11.2006, 15:46

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •