Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите Советом

8.5K
04 января 2005 года
CaveCanem
13 / / 04.01.2005
Имеется программа написанная в Borland C++Builder 6 по расчету сужающих устройств.
Написана с применением циклов FOR.

Суть проблемы в следующем: в процессе расчета программа как бы «виснет» т.е. невозможно нажать на любую кнопку в программе и отменить расчет.
А в зависимости от данных расчет может занять до 5 минут (это не ошибка в программе), а отменить его невозможно приходится прибивать процесс в WinXP, что очень неудобно особенно для людей плохо знакомым с компьютером.
259
04 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by CaveCanem
Имеется программа написанная в 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);
8.5K
04 января 2005 года
CaveCanem
13 / / 04.01.2005
Спасибо, Попробую.
8.5K
04 января 2005 года
CaveCanem
13 / / 04.01.2005
Попробовал.

На нажатие клавиши на клавиатуре реагирует, расчет прекращается.
Но форма и элементы на ней все так же недоступны в процессе расчета.
Невозможно свернуть / развернуть форму, нажимать на кнопки.
Если свернуть все окна системным способом ( значок «Свернуть Все») то обратно не восстанавливается и приходится ждать завершения расчета.
4
04 января 2005 года
mike
3.7K / / 01.10.2002
Делай Appication->ProcessMesages() внутри своего цикла. Может быть не в самом внутреннем, но так чтоб раз 10-20 в секунду срабатывало.
8.5K
04 января 2005 года
CaveCanem
13 / / 04.01.2005
Большое спасибо, но, к сожалению не помогло.

Пришлось переписывать прогу и реализовывать многопоточность т.е
запускать функцию расчета в отдельном потоке теперь все ОК.
243
05 января 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by CaveCanem
Имеется программа написанная в Borland C++Builder 6 по расчету сужающих устройств.
Написана с применением циклов FOR.

Суть проблемы в следующем: в процессе расчета программа как бы «виснет» т.е. невозможно нажать на любую кнопку в программе и отменить расчет.
А в зависимости от данных расчет может занять до 5 минут (это не ошибка в программе), а отменить его невозможно приходится прибивать процесс в WinXP, что очень неудобно особенно для людей плохо знакомым с компьютером.


Сделай расчет в отдельном потоке - File->New->Other->Thread Object. Назнач ему нужный приоритет - ничего виснуть не будет. А для остановки расчета используй метод Suspend(void).
З.Ы. Чуть не забыл - метод Suspend() весьма глючноват. Но при желании можно обойти и это.

301
05 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by pacific_7

Сделай расчет в отдельном потоке - File->New->Other->Thread Object. Назнач ему нужный приоритет - ничего виснуть не будет. А для остановки расчета используй метод Suspend(void).
З.Ы. Чуть не забыл - метод Suspend() весьма глючноват. Но при желании можно обойти и это.


Тихий океан подчеркивание семь, прочитай предыдущий пост.=)
(Да простят мне флуд.)

243
06 января 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by lord Kelvin

Тихий океан подчеркивание семь, прочитай предыдущий пост.=)
(Да простят мне флуд.)


Читал! Многопоточность можно реализовать не только через Thread Object! Просто для билдера это самый лучший вариант.

1
07 января 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by pacific_7

Читал! Многопоточность можно реализовать не только через Thread Object! Просто для билдера это самый лучший вариант.


А Thread Object здесь причем? Многопоточность можно реализовать только одним способом - создав собственно поток. А выполнишь ли ты это через класс Thread Object используя его методы - или самостоятельно, обратившись к АПИ ОС - роли здесь никакой не играет. Thread Object - ПРОЩЕ для борландовских сред - но это лучшим его не делает. Как в принципе и советы которые по сути ничего не несут. Поддерживаю lord Kelvin
За флуд прошу также простить...:D

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог