Помогите Советом
Написана с применением циклов FOR.
Суть проблемы в следующем: в процессе расчета программа как бы «виснет» т.е. невозможно нажать на любую кнопку в программе и отменить расчет.
А в зависимости от данных расчет может занять до 5 минут (это не ошибка в программе), а отменить его невозможно приходится прибивать процесс в WinXP, что очень неудобно особенно для людей плохо знакомым с компьютером.
Имеется программа написанная в Borland C++Builder 6 по расчету сужающих устройств.
Написана с применением циклов FOR.
Суть проблемы в следующем: в процессе расчета программа как бы «виснет» т.е. невозможно нажать на любую кнопку в программе и отменить расчет.
А в зависимости от данных расчет может занять до 5 минут (это не ошибка в программе), а отменить его невозможно приходится прибивать процесс в WinXP, что очень неудобно особенно для людей плохо знакомым с компьютером.
Перехватывай события от клавы и обрабатывай их. Приблизительно так:
HHOOK hk;
//Обработчик для системной очереди клавы. Все события с клавой попадают сюда.
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//wParam - виртуальный Key код
//lParam - там много всяких битиков. в.т.ч. т сканкод нажатой клавиши
//Подробнее:
//Бит: значение
//0-15 счетчик повторений нажатай клавиши (дребезг).
//16-23 скан-код (OEM).
//24 1 - клавиша на доп. клавиатуре, 0 на основной.
//25-28 Не занято.
//29 1 - нажата вместе с alt, 0 - нет.
//30 1 - клавиша нажата перед посылкой в очеред, 0 - отпущена
//31 1 - клавишу начинают отпускать, 0 - клавишу начинают нажимать.
//29 - 30 это для подавления дребезга клавиатуры
//Здесь ставишь проверку на свою комбинацию.
//Для проверки ксати можно использовать GetKeyboardState(...)
MessageBox(NULL,"Пора вставать","Пора вставать",MB_OK);
//Если не наша комбинация передаем дальше
return CallNextHookEx(hk, nCode, wParam, lParam);
}
//Скажем перед входом в цикл
hk = SetWindowsHookEx(WH_KEYBOARD,&HookProc, NULL, 0);
//При отмене расчета
UnhookWindowsHookEx(hk);
На нажатие клавиши на клавиатуре реагирует, расчет прекращается.
Но форма и элементы на ней все так же недоступны в процессе расчета.
Невозможно свернуть / развернуть форму, нажимать на кнопки.
Если свернуть все окна системным способом ( значок «Свернуть Все») то обратно не восстанавливается и приходится ждать завершения расчета.
Пришлось переписывать прогу и реализовывать многопоточность т.е
запускать функцию расчета в отдельном потоке теперь все ОК.
Имеется программа написанная в Borland C++Builder 6 по расчету сужающих устройств.
Написана с применением циклов FOR.
Суть проблемы в следующем: в процессе расчета программа как бы «виснет» т.е. невозможно нажать на любую кнопку в программе и отменить расчет.
А в зависимости от данных расчет может занять до 5 минут (это не ошибка в программе), а отменить его невозможно приходится прибивать процесс в WinXP, что очень неудобно особенно для людей плохо знакомым с компьютером.
Сделай расчет в отдельном потоке - File->New->Other->Thread Object. Назнач ему нужный приоритет - ничего виснуть не будет. А для остановки расчета используй метод Suspend(void).
З.Ы. Чуть не забыл - метод Suspend() весьма глючноват. Но при желании можно обойти и это.
Сделай расчет в отдельном потоке - File->New->Other->Thread Object. Назнач ему нужный приоритет - ничего виснуть не будет. А для остановки расчета используй метод Suspend(void).
З.Ы. Чуть не забыл - метод Suspend() весьма глючноват. Но при желании можно обойти и это.
Тихий океан подчеркивание семь, прочитай предыдущий пост.=)
(Да простят мне флуд.)
Тихий океан подчеркивание семь, прочитай предыдущий пост.=)
(Да простят мне флуд.)
Читал! Многопоточность можно реализовать не только через Thread Object! Просто для билдера это самый лучший вариант.
Читал! Многопоточность можно реализовать не только через Thread Object! Просто для билдера это самый лучший вариант.
А Thread Object здесь причем? Многопоточность можно реализовать только одним способом - создав собственно поток. А выполнишь ли ты это через класс Thread Object используя его методы - или самостоятельно, обратившись к АПИ ОС - роли здесь никакой не играет. Thread Object - ПРОЩЕ для борландовских сред - но это лучшим его не делает. Как в принципе и советы которые по сути ничего не несут. Поддерживаю lord Kelvin
За флуд прошу также простить...:D