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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4] 5 6 ... 65
46  Компиляторы и платформы / Linux / Re: Работа с сигналами : Май 07, 2018, 15:08
все подробно расписал, а проект не приложил на посмотреть, не копипастить же
гдето в статье https://www.macieira.org/blog/2012/07/forkfd-part-4-proposed-solutions/ были упоминания о сигналах, но может и не связано

исследование ради какой цели делается ?


Исследования делаются для себя, чтобы понимать как правильно работать Улыбающийся
47  Компиляторы и платформы / Linux / Работа с сигналами : Май 07, 2018, 13:00
Написал простую программку для исследования работы сигналов в ОС Линукс

Вот код программы:

main.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include <signal.h>
 
#include <QApplication>
 
static void sighandler(int sig)
{
   switch(sig){
 
   case SIGCHLD:
       printf("catch signal handler signal number = %d\n ",sig);
       printf("discribe signal:  %s\n",sys_siglist[sig]);
       wait(0);
       return;
 
   case SIGUSR1:
       printf("catch SIGUSR1 handler signal number = %d\n ",sig);
       printf("discribe signal:  %s\n",sys_siglist[sig]);
       return;
 
   case SIGUSR2:
       printf("catch SIGUSR2 handler signal number = %d\n ",sig);
       printf("discribe signal:  %s\n",sys_siglist[sig]);
       return;
 
   default:
       return;
   }
}
 
int main(int argc, char *argv[])
{
   //подключение обработки сигнала SIGCHLD
   if(signal(SIGCHLD,sighandler) == SIG_ERR){
       fprintf(stderr,"ERROR SIGKILL\n");
       exit(EXIT_FAILURE);
   }
 
   //подключение обработки сигнала SIGUSR1
   if(signal(SIGUSR1,sighandler) == SIG_ERR){
       fprintf(stderr,"ERROR SIGKILL\n");
       exit(EXIT_FAILURE);
   }
 
   //подключение обработки сигнала SIGUSR2
   if(signal(SIGUSR2,sighandler) == SIG_ERR){
       fprintf(stderr,"ERROR SIGKILL\n");
       exit(EXIT_FAILURE);
   }
 
 
   int var = 0;
   int a_exec = 0;
 
   pid_t pid = fork();
   if(pid > 0){
       //var = 1;
       QApplication a(argc, argv);
       MainWindow w;
       w.setWindowTitle(QString("parent process pid = %1").arg(getpid()));
       w.show();
       a_exec = a.exec();
   }
   else{
       var = 2;
       QApplication a(argc, argv);
       MainWindow w;
       w.setWindowTitle(QString("child process pid = %1").arg(getpid()));
       w.show();
       a_exec =  a.exec();
   }
 
   qDebug()<<"var = "<<var;
   qDebug()<<"a_exec = "<<a_exec;
 
   return a_exec;
}
 

mainwindow.cpp
Код
C++ (Qt)
 
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   connect(ui->pbCreate,   SIGNAL(clicked()),this,SLOT(clickedCreate()));
   connect(ui->pbKill,     SIGNAL(clicked()),this,SLOT(clickedKill()));
 
   thread = new Thread;
   connect(thread,SIGNAL(sg_child_pid(int))    ,this,SLOT(setTextChildPID(int)));
   connect(thread,SIGNAL(sg_parent_pid(int))   ,this,SLOT(setTextParentPID(int)));
   connect(thread,SIGNAL(fin())                ,this,SLOT(finishedThread()));
   thread->set_active_thread(true);
   thread->start();
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::closeEvent(QCloseEvent * event)
{
   thread->set_active_thread(false);
   thread->quit();
   thread->wait();
   delete thread;
   thread = NULL;
 
   QMainWindow::closeEvent(event);
}
 
void MainWindow::clickedCreate()
{
   if(thread){
       if(!(thread->create_process()))
           thread->set_create_process(true);
   }
}
 
void MainWindow::clickedKill()
{
   if(thread){
       QString str = ui->lePID->text();
       if(!str.isEmpty()){
           pid_t pid = (pid_t)(str.toInt());
           if(!(thread->kill_process(pid))){
               if(!listPID.isEmpty()){
                   listPID.removeOne((int)pid);
               }
               else{
                   qDebug()<<"LIST PID IS EMPTY!";
               }
           }
           else{
               qDebug()<<"CAN NOT DO KILL!";
           }
       }
       else{
           qDebug()<<"ENTER PID NUMBER!";
       }
   }
}
 
void MainWindow::setTextChildPID(int pid)
{
   qDebug()<<__FUNCTION__;
 
   ui->leChildPID->setText(QString("%1").arg(pid));
   listPID.append(pid);
}
 
void MainWindow::setTextParentPID(int pid)
{
   qDebug()<<__FUNCTION__;
 
   ui->leParentPID->setText(QString("%1").arg(pid));
}
 
void MainWindow::finishedThread()
{
   qDebug()<<__FUNCTION__;
}
 

thread.cpp
Код
C++ (Qt)
Thread::Thread(QObject * parent) : QThread(parent)
{
   m_create_process = false;
   m_active_thread = false;
}
 
Thread::~Thread()
{
}
 
bool Thread::active_thread()
{
   bool active;
   mutex_active_thread.lock();
   active = m_active_thread;
   mutex_active_thread.unlock();
   return active;
}
 
void Thread::set_active_thread(bool active)
{
   mutex_active_thread.lock();
   m_active_thread = active;
   mutex_active_thread.unlock();
}
 
void Thread::set_create_process(bool create)
{
   mutex_create_process.lock();
   m_create_process = create;
   mutex_create_process.unlock();
}
 
bool Thread::create_process()
{
   bool create;
   mutex_create_process.lock();
   create = m_create_process;
   mutex_create_process.unlock();
   return create;
}
 
bool Thread::kill_process(pid_t pid)
{
   return kill(pid,SIGKILL);
}
 
void Thread::run()
{
   raise(SIGUSR1);
 
   while(active_thread())//for(;;)
   {
       msleep(5);
       //проверяем флаг на создание нового процесса
       if(create_process()){
       //сбрасываем флаг
           m_create_process = false;
 
           pid_t pid = fork();
           if(pid > 0){    //_____родительский процесс_____
               qDebug()<<"_____PARENT_PROCESS_____";
 
               pid_t childprocess_id = pid;
               pid_t parentprocess_id = getpid();
 
               emit sg_parent_pid((int)(parentprocess_id));
               emit sg_child_pid((int)(childprocess_id));
           }
           else{        
 
               pid_t process_id = getpid();
               qDebug()<<"process_id = "<<process_id;
 
               pid_t parentprocess_id = getppid();
               qDebug()<<"parentprocess_id = "<<parentprocess_id;
 
               //высылаем сигнал родительскому процессу
               kill(parentprocess_id,SIGUSR2);
 
                   QFile file("data.txt");
                   if(file.open(QFile::ReadWrite/*|QFile::Append*/)){
                       file.seek(0);
                       QString str = QString("pid = %1 time = %2:%3:%4:%5\n")
                               .arg(process_id)
                               .arg((QTime::currentTime()).hour())
                               .arg((QTime::currentTime()).minute())
                               .arg((QTime::currentTime()).second())
                               .arg((QTime::currentTime()).msec());
 
                       file.write(str.toLatin1().data(),str.size());
                   }
                   file.close();
 
           }
       }
   }
 
   printf("printf out of thread\n");
   qDebug()<<"qDebug() out of thread";
 
   emit fin();
 

В начале создаются два окна - одно в родительском процессе, одно в дочренем.

В конструкторе MainWindow создается поток, в теле которого может создаваться дочерний
процесс, в котором происходит запись в файл.

Так же мы можем по нажатию кнопки создать еще один дочерний процесс в котором происходит постоянная запись в файл.  

Есть обработчик сигналов, который обрабатывает сигналы SIGCHLD, SIGUSR1,SIGUSR2.
Cоответственно номер SIGCHLD = 17
                              номер SIGUSR1 = 10
                              номер SIGUSR2 = 12

При запуске исполняемого файла из консоли, почему-то сначала появяляется только окно
дочернего процесса и в консоль выводится

Код:
catch signal handler signal number = 17
 discribe signal:  Child exited
catch SIGUSR1 handler signal number = 10
 discribe signal:  User defined signal 1
catch signal handler signal number = 17
 discribe signal:  Child exited

Такое впечатление что были убиты какие-то дочерние процессы, хотя ничего такого не происходило.

Если же запускать программу из-под креатора то все норм, в консоль креатора ничего такого не
выводится и видно два окна(созданное в родительском и дочернем процессах)

Правильно ли я понимаю, что обработчик сигналов sighandler(int sig) начинает работу после завершения QApplication::exec()

48  Qt / Общие вопросы / ICP алгоритм : Апрель 11, 2018, 12:30
Господа кто-нибудь работал с данным алгоритмом.
Можете подсказать где взять готовую функцию по его использованию.
На сайте mathworks смотрел, пробовал ее вкорячить, но почему-то не получилось.
Если ставить библиотеку plc, то к ней надо еще кучу всего ставить.

Есть ли какой-то вариант попроще?
49  Qt / Общие вопросы / Re: Visual Studio 2017 proffesional +qt 5.6 msvc2015 : Март 28, 2018, 20:43
Visual Studio 2017 + qt 5.6 msvc2015
достаточно очевидно, что не взлетит

Но для x64(qt 5.6.2 msvc 2015_64) взлетела.

Может либы подтягиваю, которые для х64  платформы.
Возможено из-за этого линковщик ругается???
Как вы считайте?
50  Qt / Общие вопросы / Visual Studio 2017 proffesional +qt 5.6 msvc2015 : Март 28, 2018, 17:00
Пытаюсь пересобрать проект на 32-битную версию
Visual Studio 2017 + qt 5.6 msvc2015

Выдает на выхлопе ошибку
Код:
LNK1112  тип компьютера модуля ×64 противоречит типу 
целевого компьютера ×86

Типа ошибка в файле msvcprt.lib(MSVCP140.dll)

 Непонимающий Как это обойти
51  Qt / Общие вопросы / указатели на функцию : Март 14, 2018, 10:47
Скажите возможна ли такая работа с указателями на функцию в классе

Код
C++ (Qt)
class MainWindow : publc QMainWindow
{
 
      Q_OBJECT
 
public:
     MainWindow();
     virtual~MainWindow();
 
private slots:
     void clickedPbFunc1();
     void clickedPbFunc2();
 
private:
    void Operation(void (MainWindow::*funcPtr)());
    void Func1();
    void Func2();
}
 

Код
C++ (Qt)
 
void MainWindow::Operation(void (MainWindow::*funcPtr)())
{
    SmthClass *smth = new SmthClass;
    connect(smth, &SmthClass::smth_signal, this, funcPtr);
}
 
void MainWindow::clickedPbFunc1()
{
      Operation(&MainWindow::Func1);
}
 
void MainWindow::clickedPbFunc2()
{
      Operation(&MainWindow::Func2);
}
 
 
52  Qt / Общие вопросы / Обработка событий подключения USB устройства : Декабрь 26, 2017, 12:03
Пытаюсь написать обработчик подключения USB(ОС Windows 7)

Но почему-то когда я подключаю USB-камеру ничего не происходит,
а с дисковыми накопителями все норм???

И как можно получить имя подключаемого устройства?

Подскажите как можно это реализовать.

Вот исходный код
Код
C++ (Qt)
bool Widget::nativeEvent(const QByteArray & eventType, void *message, long *result)
{
   MSG * msg = static_cast<MSG*>(message);
   switch(msg->message){
   case WM_DEVICECHANGE:
           //
            switch(msg->wParam){
            case DBT_DEVICEARRIVAL:
                     qDebug()<<"USB SET";
                     return true;
 
            case DBT_DEVICEREMOVECOMPLETE:
                     qDebug()<<"USB REMOVE";
                     return true;
 
             default: return false;
 
             break;
  }
 
  return false;
}
 
53  Qt / Многопоточное программирование, процессы / Re: Как завершить поток таймера? : Декабрь 12, 2017, 18:03
Поправьте меня - возможно я не прав, но
возможно так лучше будет
Код
C++ (Qt)
thread->quit();
thread->wait();
delete thread;
 

И тогда вот этого не будет
Код:
QThread: Destroyed while thread is still running


Так тоже будет корректно, но тогда уж лучше сразу переменную на стеке делать и не мучаться с new/delete.



Вы имейти  ввиду переменную на стеке - т.е в run
54  Qt / Многопоточное программирование, процессы / Re: Как завершить поток таймера? : Декабрь 12, 2017, 18:01
последующий вызов QThread::wait() гарантирует как минимум еще одну итерацию event loop потока
wait ничего не гарантирует, даже более он сам блокирует поток в котором запущен до завершения ожидаемой нитки. В это время eventloop не крутиться.


Т.е Вы хотите сказать тем самым, что в книге Боровский А.Н. Qt 4.7+ Практическое программирование на С++ (2012г.) стр 169 Листинг 5.3 (глава 5) НЕ ВЕРЕН И В НЕМ ОШИБКА.
55  Qt / Многопоточное программирование, процессы / Re: Как завершить поток таймера? : Декабрь 12, 2017, 15:02
Ответ = вызов в нём deleteLater и quit.

Предположим, что deleteLater() для экземпляра thread отработал, это значит еще не был завершен его метод run() и exec() в другом потоке, что может быть чревато последствиями - QThread: Destroyed while thread is still running и все что описано ранее в примере 1.
Если же сначала завершить поток, а затем вызвать deleteLater(), то экземпляр thread не будет удален совсем - утечки памяти.

Простой пример

Код
C++ (Qt)
class Thread
: public QThread
{
public:
   ~Thread ()
   {
       ::std::cout << "Deleted" << ::std::endl;
   }
 
   virtual void run ()
   {
       ::std::cout << "Before exec" << ::std::endl;
       exec();
       ::std::cout << "After exec" << ::std::endl;
   }
};
 
int main ( int argc, char ** argv )
{
   QCoreApplication app( argc, argv );
 
   QThread * thread = new Thread;
   thread->moveToThread( thread );
   thread->start();
   thread->deleteLater();
   thread->quit();
 
   return app.exec();
}
 

выводит только

Код:
Before exec
After exec

либо, если между deleteLater() и quit() будет достаточно времени (например, пауза или логика какая)

Код:
Before exec
Deleted
QThread: Destroyed while thread is still running
After exec


Поправьте меня - возможно я не прав, но
возможно так лучше будет
Код
C++ (Qt)
thread->quit();
thread->wait();
delete thread;
 

И тогда вот этого не будет
Код:
QThread: Destroyed while thread is still running
56  Qt / Общие вопросы / Re: QImage поворот изображения : Ноябрь 24, 2017, 16:43
А не подскажите как с помощью QMatrix увеличить изображение Строит глазки
57  Qt / Общие вопросы / Re: QImage поворот изображения : Ноябрь 24, 2017, 12:10
Спасибо
58  Qt / Общие вопросы / QImage поворот изображения : Ноябрь 24, 2017, 10:23
Доброго дня, всем!!!
Скажите как с помощью QImage::transformed повернуть(вращать) изображение.
Спасибо!
59  Qt / Общие вопросы / Re: Русский текст Qt5.6.2 VS2015 : Ноябрь 10, 2017, 14:23
На эту настройку студии глубоко по... Кодировка каждого файла задается персонально (правда, всего один раз таким образом) через File -> Advanced Save Options (для студии 2013).

Спасибо Улыбающийся
60  Qt / Общие вопросы / Re: Русский текст Qt5.6.2 VS2015 : Ноябрь 10, 2017, 10:57
надо сохранять файл в кодировке UTF-8

Ну у меня файл сохраняется в кодировке UTF-8
Код:
Tools->Options->Text Editor  
В Settings стоит галака
Код:
Auto-detect UTF-8 encoding without signature
работаю в VS 2015
Страниц: 1 2 3 [4] 5 6 ... 65

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