简而言之,我会得到以下错误: QObject::connect: Cannot queue arguments of type 'cv::Mat' (Make sure 'cv::Mat' is registered using qRegisterMetaType().) 我要做的是发送一个信号,其中包含两个CV :: MAT图像从Qthread到主线程,以便我可以显示输出.没有编译的时间错误,但是当我运行程序时,它会卡在qglobal.h(inline void qt_noop() {})中的断点. 我尝试将Q_DECLARE_METATYPE(cv::Mat)添加到代码中,但无济于事.我现在该怎么做很糟糕. 代码 在qthread类中: signals: void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye); void eyesDriver::run() { forever {
以下是关于 qthread 的编程技术问答
我读了本文如何真正使用qthreads;完整的说明,它说,而不是子类qthread,然后重新进化run(),应该使用movetothread使用movetothread(qthread*)将qobject推向qthread实例 这是C ++示例,但我不知道如何将其转换为Python代码. class Worker : public QObject { Q_OBJECT QThread workerThread; public slots: void doWork(const QString ¶meter) { // ... emit resultReady(result); } signals: void resultReady(const QString &result); }; class Controller : public QObject { Q
我有一个工作代码的工作示例,该示例可以创建一个必须从我的课堂(myclass)调用的qthread.我尝试通过工人 init 传递其他论点,但我无法正常工作. 如何使用此工作代码将1或更多参数传递给我的工作线程? from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4.QtCore import * class Worker(QThread): processdone = QtCore.pyqtSignal("QString") # Define custom signal. def __init__(self, parent=None): QThread.__init__(self, parent) def run(self): print("do worker thread processing here") self.emit( S
在单个线程中,我有这个美丽的类,将所有Cout输出重定向到qtextedit #include #include #include #include #include "QTextEdit" #include "QDateTime" class ThreadLogStream : public std::basic_streambuf, QObject { Q_OBJECT public: ThreadLogStream(std::ostream &stream) : m_stream(stream) { m_old_buf = stream.rdbuf(); stream.rdbuf(this); } ~ThreadLogStream() { // output anything
我正在尝试制作一个在不同线程中分配的"自我包含"的通信对象,以使其与GUI处理延迟隔离. 因此,在一个" appcore"对象创建中,我创建一个没有父母的" commcore": cAppCore::cAppCore(QObject *parent) : QObject(parent) { .... CommCore = new cCommCore; (here I do signal-slot connections between CommCore and AppCore) .... } ,在Commcore构造函数中,我执行以下操作: cCommCore::cCommCore(QObject *parent) : QObject(parent) { CommThread = new QThread(this); CommSerial = new QSerialPort(this); CommTimer =
我在QT线程以某种方式停滞了主GUI时遇到问题. 回答第一个问题...是的,Qthread并未分类,并且是"正确的方式". 该线程是长期运行的(不是" do x the the exit"),并且主要循环确实有延迟/睡眠. 线程的主要目的是从其他地方收集数据,构成图像并通过COM端口传输该图像. 我认为有一些编码区域可能会引起问题. IM使用我自己的"睡眠"功能作为MSLEEP(不可用的). 谁能看到下面的代码有任何问题? void SendImageJob::tSleep(int ms) { QElapsedTimer timer; timer.start(); while ((timer.elapsed()
我有两个线程和两个线程.由他们的标题文件中的各自类定义.我想在启动第一个线程时启动第二个线程.在第一个产生意外结果的构造函数中创建并启动第二个线程. 我的标题文件" header.h" #ifndef HEADER #define HEADER #include class One:public QThread { public: One(); void run(); }; class Two:public QThread { public: Two(); void run(); }; #endif 我的类文件" main.cpp" #include "header.h" #include using namespace std; One::One() { /* the output just hangs at thread two and does not get to thread one ru
我在线程限制方面有问题.我想使用qthread进行.因此,SpiderThread是Qthread对象爬一些URL.但是我想一次将工作线程限制在X线程中.我早些时候使用了ThreadPool和Qrunnable进行了此操作,但是当URL数量很大时,它在Pyside中是越野车.所以我有一个简单的代码: self.threads = [] for url in self.urls: th = SpiderThread(url) th.updateresultsSignal.connect(self.update_results) self.threads.append(th) th.start() 有人使用qthread? 有限制线程的工作示例 解决方案 因此,您想在任何给定时间都在运行最多X线程吗?那么,由10个线程共享的URL队列如何: self.threads = [] queueu = Q
我想在另一个启动时启动一个qthread,但它不起作用. main.cpp代码 Worker stat_worker; stat_worker.moveToThread(stat_worker.stat_thread); Worker some; some.moveToThread(some.somethread); QObject::connect(stat_worker.stat_thread, SIGNAL(started()), some.somethread, SLOT(start())); QObject::connect(some.somethread, SIGNAL(started()), &some, SLOT(print_some())); stat_worker.stat_thread->start(); worker.h class Worker : public QObject { Q_OBJECT public: exp
因此,我有一个带有启动按钮,停止按钮和文本字段的简单QT4应用程序.按下"启动"按钮时,将产生一个新线程,该线程不断增加计数器(在段循环中),并更新文本字段以通过信号/插槽来反映这一点.按下停止按钮时,计数停止,直到再次按下开始按钮. 它有效...有点.它仅每秒更新一次计数器;我希望它能更快,例如每秒44100次.但是,取出睡眠(1)呼叫会导致WARE循环阻止,没有确认GUI事件,并且应用程序冻结.另外,停止按钮仅在第二次尝试中起作用? 当我分类qthread时,这曾经工作得很好,但是我被告知不要这样做,所以我尝试使用子分类qobject制作解决方案,然后将对象移至qthread ...但是不是工作和过去. 这是代码: Worker.h class Worker : public QObject { Q_OBJECT public: Worker(); public slots: void process(); voi
i具有将QStandardItemModel绑定到QListView的QT4应用程序,并将模型从背景/非UI线程更新. 有时,当QStandardItem的S setText(..)方法从非UI线程反复调用时,该应用程序将在la datachanganged(..)处理程序中崩溃.我可以通过在for循环中反复致电setText("xxxxx")来复制问题.在我的应用中,从网络中读取数据,因此我在单独的非UI线程中更新模型. 这是常见的PB吗?如果我正确理解,这与排队连接有关,QStandardItemModel不是线程安全吗?如何解决这个问题? 谢谢! 解决方案 QStandardItemModel是QTGUI库的一部分,IIRC中的所有类都被认为不是螺纹保护.如果将数据的实际设置移至GUI线程,则应该可以.您可以使用网络线程的排队信号很容易地执行此操作.
我尝试构建使用QT的多线程游戏服务器,因此,每个客户端都是基于独立线程的" Qthread".现在,我需要将数据发送到同一游戏室中的其他客户端(在其他线程中).例如,当房主关闭游戏室时,游戏服务器需要发送到同一SOOM中的其他客户的" room_clated"消息,但是有一个错误: qsocketNotifier:套接字通知器无法启用或禁用 另一个线程 ps:我尝试使用罪恶/插槽,但仍然存在错误: qobject:无法为不同的父母创建孩子 线. (父级是qnationsocketEngine(0x161764e8),父母的线程为 clientthread(0x16196f10),当前线程为qthread(0x14a17278) 我该怎么办? 解决方案 看来,您似乎不正确处理Qobject和Qthreads,并且QT抱怨它. 我建议您查看QT文档: thread and qobject ">/li> qObject thread > 快速指
我不是多线程专家. 我知道GUI应该由主线程管理,但是我需要同时由主要线程来完成两件事. 情况如下: 用户单击按钮(拍摄自拍照),计数计时器开始(3秒).用户可以在qlabel中看到数字3-2每秒更改.同时,用户可以在同一窗口的另一个Qlabel中看到相机数据. 换句话说,主要线程应该做2件事: 更新Qlabel1始终显示计时器 用相机中的实时视频播放更新Qlabel2 我很难实现这一目标.有人可以帮我吗? 我不一定要解决一个简单的技巧/工作.我想使用多线程这样,我可以提高对此技术的了解,而不仅仅是一次轻松/快速变速的方法... 谢谢 我当前的代码: 我尝试的是:当用户单击" btntakesnap"按钮时,启动了一个新线程,在该线程中,计时器开始计算并更新labeltimesnap(这是一个Qlabel,我在其中加载带有数字3--的" fancy"图像的Qlabel 0).计时器到达0时拍摄图片. ,但我看不到我的Qlabel随着计时器
问题 所以我有一个命令命令的命令类别,应该在不同的线程上执行这些命令. class CommandRetriever { public: CommandRetriever(); ~CommandRetriever(); void addCommand( QString, Command* ); void executeCommands(); private: QMap m_commands; }; addCommand将在m_commands中添加一个新条目.但是,这是所讨论的功能. void CommandRetriever::executeCommands() { for( auto iter : m_commands.keys() ) { Command *cmd = m_comman
我正在构建一个QT GUI应用程序,该应用程序使用Qthread/Qobject组合来充当主线程之外做事的工人. 通过moveToThread,qobject移动到qthread.这样,我的工人可以具有信号(是一个qobject)和插槽,这些插槽是在事件循环中处理的(由Qthread提供). 现在,我想让工人以一种特殊的方式行事,即每当循环中的一个插槽击中python例外. 通过进行一些测试,我发现在pyqt5中,插槽中的一个例外导致整个应用程序停止,就我而言,这是与pyqt4相比的有意更改跑步.我读到,可以通过将自己的" excepthook"到sys.excepthook来避免这种情况,QT以阻止解释器的方式实现. 所以我做到了,到目前为止,这有效.此外,Excepthook使我能够在发生例外时exit()我的工人,因为我在其他地方找不到更好的方法.我尝试在Qthread的run()方法中对exec_()的呼叫进行子分类,并将try..except放在try.
我是C ++和QT的新手,并且在实现良好且没有过度复杂的多线程通信环境方面遇到了一些麻烦. 基本上,我有3个线程,一个用于GUI,另一个用于处理由USB连接到PC的device发送的更新,另一个将处理由device>和control获得的信息device和GUI改变其状态.因此,基本上是3个线程:GUI,device和control. 我的拳头方法是让device使用USB发送的信息填充其私人成员,并具有一些get()方法来转换此数据并返回它(使用Mutexes确保数据仍然有效).问题是control在device中调用control方法时,它不会返回任何新的东西(我期望这些方法甚至永远不会返回,因为线程已锁定在另一种方法中,但是它们确实返回,没有新的新方法信息,并且在这些get()方法中也没有触发断点). 通常的方式QT QT使用信号和插槽是通过使用信号和插槽,但是信号和插槽的问题是,当一个线程正在处理并且具有插槽时,如果发送某些信号,将永远不会执行此插槽.即使我可以
所以我使用QT设计师创建了GUI.它运行良好,但是在更复杂的调用中,它不会更新主窗口并锁定.我想在不断更改后端信息的主窗口中更新主窗口中的文本eDIT时运行我的CustomComplexFunction(),我希望它每2秒钟运行一次.以下代码似乎正确,并且没有错误运行,但不会更新TextEdit.请注意,我正在用pushbutton和textedit导入一个来自QT设计器设计的.UI文件,并且没有它的代码将无法运行. main.py import sys from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QMainWindow from PyQt5.QtCore import QCoreApplication, QObject, QRunnable, QThread, QThreadPool, pyqtSignal, pyqtSlot from PyQt5 import u
我正在尝试创建一个新线程gpsthread,该线程应在后面运行并存储值. class gpsthread: public QThread{ Q_OBJECT private:nrega_status_t status2; public: explicit gpsthread(QObject *parent = 0):QThread(parent) { // QTimer *t = new QTimer(this); // connect(t, SIGNAL(timeout()), this, SLOT(processgps())); // t->start(10000); } void run(){ qDebug()
完成处理后,我正在尝试退出线程.我正在使用Movetothread.我正在尝试通过在插槽中调用self.thread.quit()从主线程中退出工作线程.这是不起作用的. 我发现了使用Movetothread启动线程的几个示例,例如该线程.但是我找不到如何退出一个. from PyQt5.QtCore import QObject, QThread from PyQt5.QtCore import pyqtSlot, pyqtSignal from PyQt5.QtWidgets import QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() print("Base init") self.start_thread() @pyqtSlot(int) def onFinished(self,