从c++线程发出一个信号
Qt - emit a signal from a c++ thread
我想在Qt中从c++线程(std::thread)发出一个信号。
我该怎么做?
您绝对可以从线程(QThread
, std::thread
甚至boost::thread
)发出信号。只有您必须小心连接函数的第五个参数(Qt::ConnectionType
):
如果Qt::DirectConnection
:槽被立即调用(从当前线程),当信号被发出。如果Qt::QueuedConnection
:槽被调用时,控制返回到事件循环的接收者的线程。插槽在接收者的线程中执行。
更多选项参见ConnectionType-enum。
问题不在于你从哪个线程发出信号,而在于哪个线程调用了插槽。例如,我认为QLabel::setText
必须从QLabel
的所有者线程(很可能是主线程)执行。因此,如果您从一个线程发出连接到QLabel
的setText
的信号,则必须与Qt::AutoConnection
, Qt::QueuedConnection
或Qt::BlockingQueuedConnection
进行连接。
一般情况下,您可能不应该不小心从std::thread
创建的线程发出Qt信号。参考Jpo38的回答:连接类型很重要,等等…
如果线程正在运行一些Qt事件循环,您可能可以。参见threads和QObject
有一个(可能是Unix特定的)解决方案,与Qt的Unix信号相同:使用从std::thread
到主线程的管道。
但是,正如Joachim Pileborg所评论的,你应该创建自己的QThread。它是最简单的,可能是最短的(就源代码而言),你只需要复制和粘贴一些现有的例子,并使其适应你的需要。
注意,恐怕只有主线程应该做Qt GUI操作。你不应该在主线程之外使用任何QWidget(等等…)!(顺便说一句,GTK有相同的限制,至少在Linux上:只有主线程应该使用X Windows系统协议)
如果你要保持QObject的指针,那么你可以使用QMetaObject::invokeMethod
成员http://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod
可能你将不得不使用Qt::QueuedConnection
,这样你的信号将在适当的线程(而不是你的std::线程)被调用。请记住,您的信号不会立即被调用。
class MainForm : public QMainWindow
{
Q_OBJECT
public:
explicit MainForm(QWidget *parent = nullptr);
virtual ~MainForm();
private:
signals:
void signalSendButtonEnable(bool);
private slots:
void singalReceiveButtonEnable(bool);
};
MainForm::MainForm(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainForm), status_{false}, io_context_{}, timer_{io_context_}
{
ui->setupUi(this);
// bind SIGNAL & SLOT
connect(this, SIGNAL(signalSendButtonEnable(bool)), this, SLOT(singalReceiveButtonEnable(bool)));
}
MainForm::~MainForm()
{
delete ui;
}
void MainForm::singalReceiveButtonEnable(bool status){ //recv signal
qDebug() << "singalReceiveButtonEnable";
this->ui->btnConnect->setEnabled(status);
}
void MainForm::start(){
std::thread t([](){
sleep(20);
emit signalSendButtonEnable(true); //send signal
});
t.detach();
}
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- Qt将信号与另一个类方法连接
- 从另一个线程发出信号是否安全?
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 在另一个线程上发出 QObject 信号的正确方法?
- 一个 ui 成员的 Qt 连接和同一连接中的两个信号
- 一个类中的QT信号/插槽,但从不同的线程发出
- glib:在另一个线程上处理自定义 GMainContext* 循环,不引发信号处理程序
- 将一个信号连接到多个插槽 Qt
- 有没有一种方法可以将升压信号直接连接到另一个信号
- Boost::signals2-传递一个信号槽作为参数
- 通过按 Enter 完成编辑时更改或清除 QLineEdit 上的焦点,并在 Qt 中仅发送一个信号
- 从类中创建一个信号来调用外部函数
- 是否可以在切换QTreeWidgetItem复选框时创建一个信号
- GTK3如何将一个信号连接到多个窗口小部件
- 从c++线程发出一个信号
- 在静态函数中发出一个信号
- 如何从一个信号中找出进程的pid是在linux中的c++中开始的
- Qt代码不编译时,我试图连接一个信号到插槽
- 将QVector从一个信号传递到不同线程中的插槽会导致数据复制吗?