c ++ boost :: thread () в приложении Qt - ошибка: слишком много аргументов для работы - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь интегрировать функциональность boost :: thread в мои приложения Qt, но компилятор выдает ошибку.Я не новичок в boost :: thread, фактически я использовал его много, много раз в приложениях, отличных от qt, но по какой-то причине у меня возникают проблемы с этим.Вот точный код:

заголовочный файл:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <boost/thread.hpp>

#include <QMainWindow>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
   Q_OBJECT

   public:
      explicit MainWindow(QWidget *parent = 0);
      ~MainWindow();

   private:
      Ui::MainWindow *ui;

      static void my_lengthly_method();
};

#endif // MAINWINDOW_H

исходный файл:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);

   boost::thread(&my_lengthly_method, this);
}

MainWindow::~MainWindow()
{
   delete ui;
}

void MainWindow::my_lengthly_method()
{

}

.pro файл:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

INCLUDEPATH += $$PWD

TARGET = untitled
TEMPLATE = app

LIB_GLOBAL = /usr/lib/x86_64-linux-gnu

DEFINES += QT_DEPRECATED_WARNINGS  

SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui

LIBS += \
   -L$$LIB_GLOBAL -lboost_system \
   -L$$LIB_GLOBAL -lboost_filesystem \
   -L$$LIB_GLOBAL -lboost_thread \
   -L$$LIB_GLOBAL -lboost_regex

Iзапустите проект и:

/usr/include/boost/bind/bind.hpp:259: error: too many arguments to function
         unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
         ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~

Когда вы нажмете на ошибку, он откроет этот файл, и вот что вы получите: enter image description here

У меня естьЯ использовал эту удивительную библиотеку во многих различных проектах не Qt, и у меня никогда не было проблем.Есть ли способ обойти это?

Все мои API основаны на boost :: thread.

Я могу использовать потоки Qt, но не хочу.

Во всяком случае, прямо сейчас я хочу заставить работать нить буста.

1 Ответ

0 голосов
/ 13 июня 2018

my_lengthly_method является статическим методом, поэтому this является избыточным, просто вызовите

    boost::thread(&my_lengthly_method);

В приведенной выше строке вы создаете объект временного потока, а после выполнения этой строки временный объект потока уничтожается, в этомУ вас могут возникнуть проблемы, потому что в стандартной библиотеке C ++, когда деструктор std::thread вызывается без вызова join, вызывается std::terminate - ваше приложение закрыто.В BOOST это зависит от того, как была построена ваша библиотека, если с помощью define BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE ваш код будет работать.Но для безопасности вы должны назвать свой объект и вызвать deatch метод.

     boost::thread myThread(&my_lengthly_method);
     myThread.detach();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...