Russian Qt Forum
Ноябрь 26, 2024, 10:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: пауза в таймере  (Прочитано 5709 раз)
Firefox
Гость
« : Сентябрь 29, 2009, 22:31 »

есть программа, которая считывает данные с прибора при помощи платы сбора данных(ПСД), проделывает некоторые операции с данными и при необходимости отправляет единичный сигнал на плату, результат этого сигнала - загорается лампочка на приборе. Все эти действия происходят раз в пол секунды по таймеру.Но требуется чтобы лампочка не просто горела а мигала пока выполняется определённое условие.  как сделать задержку в несколько мили секунд после отправки 0 сигнала на прибор, иначе этого просто не видно.
Код:
MG512::MG512(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{

ui.setupUi(this);
/*pClient_dev=new XchangeSystemClient(QString("192.168.13.1"), PORT); // соединение с управляющей программой
//pClient_dev->AddToList(171, sizeof(), &, IS_READABLE);// структура для чтения дискретных данных из УП
pClient_dev->AddToList(170, sizeof(IN_YP_A), &IN_YP_A, IS_READABLE); // структура для чтения аналоговых данных от УП
*/
Timer_time = new QTimer(this);
connect(Timer_time, SIGNAL (timeout()),SLOT(Ttime()));// соединение твймера со слотом Ttime()
Timer_time->start(500); // таймер через 2 сек

}

MG512::~MG512()
{
delete Timer_time;
//delete pClient_dev;
}
void MG512::Ttime()
{
Work();
}
void MG512::Work()
{
USHORT dan=0;
KAVIT=0;
KAVIT1=0;
RABOTA=0;
RABOTA1=0;
int i;
Timer_time->start(500);
if (PITANIE1==true)
{
open();
}
read_data();// чтение данных с ПСД в В
//read_yp();// чтение данных пришедших с УП в Дб
// перевод из В в Дб аналоговых данных уровня шума с ПСД
str.sprintf("%4.2f",IN_PCD_A[0].level);
ui.lineEdit_2->setText(str);


str=(ui.lineEdit->text());// чтение с формы данных УП
// перевод  во float
form_date=str.toFloat();

Db1=V_Db(IN_PCD_A[0].level);// перевод данных с ПСД из В в Дб
// режимы работы прибора
if(Rez_E==0)
{
r_ekv();
str.sprintf("%4.2f",IN_PCD_A[1].level);
ui.lineEdit_3->setText(str);
I_ekv=1;


}

if(Rez_K==0)
{
r_kal();

}
if(Rez_I==0)
{
r_izm();
   
}
if(Rez_R==0)
{
r_rab();

}

OUT_ANALOG=Db2;
if (I_ekv!=1)
{
OUT_ANALOG=Db_V(OUT_ANALOG);// перевод в В
}
// запись аналоговых данных
write ();


}
void MG512::read_yp()// чтение данных пришедших с УП
{ // чтение дискретных данных с УП
/*if ()
{
QMessageBox("Incorrect date. Please insert value more then 0.");// если данные с формы
}*/
// Режимы работы переключателя "Работа"
// Переключатель РЕЖИМ РАБОТЫ в положении ИЗМЕРЕНИЕ
}
void MG512::r_izm()//ГОТОВО
{
RABOTA=0;
RABOTA1=0;
// деление сигнала
if(Del_5==0)
{
Db1=Db1-14;
form_date=form_date-14;


}
if(Del_50==0)
{
Db1=Db1-34;
form_date=form_date-34;


}
if(Del_250==0)
{
Db1=Db1-48;
form_date=form_date-48;


}
Db2=form_date;
end_rezult();

}
сигнал называется KAVIT, от него лампочка мигать должна
Записан
spectre71
Гость
« Ответ #1 : Сентябрь 30, 2009, 09:36 »

А нафига Timer_time->start(500);  в двух местах и нет ни одного stop?
Вызов Timer_time->start(500); в Work() явно не имеет смысла.
Вообще из твоего описания не совсем понятно что ты хочешь добиться. Толи ты хочешь чтобы лампочка загоралась 1 раз на определенное время при каждом вызове Work(), толи чтобы лампочка мигала в процессе обработки Work() ??
1) Если первый вариант, то можно сделать так http://www.prog.org.ru/topic_9968_0.html
2) Если второй вариант(для первого тоже подходит и предпочтительней), то:
  - создаем дополнительный поток реализующий "мигание" лампочки
  - в данном потоке делаем слот на который передается команда "запустить"/"остановить" мигание(для второго варианта) или команда "моргнуть" (для первого варианта)
  - в начале метода Work() посылаем потоку сигнал "запустить" (для второго варианта) или "моргнуть" (для первого варианта)
  - в конце  метода Work() посылаем потоку сигнал "остановить" (только для второго варианта)


Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Сентябрь 30, 2009, 09:50 »

Цитировать
как сделать задержку в несколько мили секунд после отправки 0 сигнала на прибор, иначе этого просто не видно.
ИМХО, это невозможно.. Можно сделать только десятками мс (если не говорить про сотни) Улыбающийся т.е не факт !
Записан

ArchLinux x86_64 / Win10 64 bit
spectre71
Гость
« Ответ #3 : Сентябрь 30, 2009, 10:03 »

Цитировать
как сделать задержку в несколько мили секунд после отправки 0 сигнала на прибор, иначе этого просто не видно.
ИМХО, это невозможно.. Можно сделать только десятками мс (если не говорить про сотни) Улыбающийся т.е не факт !
10 мс вполне возможно но это и не имелось ввиду, задача была в другом. А время задержку т.е. - время "горения", всегда можно отрегулировать как хочется.
Записан
Firefox
Гость
« Ответ #4 : Сентябрь 30, 2009, 11:52 »

Что касается второго старта таймера, то это наверно остатки от какой-либо из идей как решить проблему)) вобще конечно такого нет. Решила проблему одноразовым таймером в 0,25 секунды, в слоте которого прописала отправку на прибор 0 сигнала, управляющего лампочкой. вот и получилось, что 0.25 сек лампочка горить, а 0.25 не горит. Думаю вы имели введу тоже под реализацией второго процесса. Спасибо
Записан
Firefox
Гость
« Ответ #5 : Октябрь 09, 2009, 21:58 »

Возникла ещё одна проблема такого характера. по ходу выполнения программы нужно просто поставить ожидание в 60 секунд. как это можно организовать?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Октябрь 09, 2009, 22:07 »

Возникла ещё одна проблема такого характера. по ходу выполнения программы нужно просто поставить ожидание в 60 секунд. как это можно организовать?

Выполни поиск по форуму на предмет "sleep"
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.068 секунд. Запросов: 23.