我创建了一个具有主窗口的应用程序,并在此窗口中创建了一个QDialog。此QDialog应创建一个RenderThread,它从相机或示例中发出接收的图像发出文本。当我调试它时,似乎从未进行连接,因为在插槽CameraWindow::debugSomething
中添加断点不会被捕获。怎么了 ?
我按照这个例子:http://qt-project.org/doc/qt-4.8/threads-mandelbrot.html但似乎我做错了。
qtDEVC::qtDEVC(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
connect (ui.pushButton_startCam, SIGNAL( clicked() ),this,SLOT( startCam() ) );
/**Threading*/
CameraWindow camWindow = new CameraWindow(this);
}
int qtDEVC::startCam()
{
camWindow.show();
camWindow.startCaptureThread();
}
CameraWindow类:
CameraWindow::CameraWindow(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
connect(&thread, SIGNAL(sendText(std::string)),
this, SLOT(debugSomething(std::string)));
}
void CameraWindow::debugSomething(std::string something){
QString somethings(something.c_str());
qDebug()<<somethings;
}
int CameraWindow::startCaptureThread(){
RenderThread *thread = new RenderThread(this, guid, CLEYE_COLOR_RAW, CLEYE_VGA, 50);
thread->StartCapture(); //starts thread in low priority and sets _running to true
}
CameraWindow标题
class CameraWindow : public QDialog
{
Q_OBJECT
public:
CameraWindow(QWidget *parent = 0);
~CameraWindow();
Ui::CameraWindow ui;
public slots:
int startCaptureThread();
void debugSomething(QString);
private:
RenderThread thread;
};
RenderThread类
void RenderThread::run()
{
// image capturing loop
while(_running)
{
qDebug()<<("render while()"); //is printed with qdebug correctly
if (restart)
break;
if (abort)
return;
qDebug("it"); //is also printed with qdebug correctly
emit sendText(text);
}
RenderThread标题
class RenderThread : public QThread
{
Q_OBJECT
public:
RenderThread(QObject *parent, GUID cameraGUID, CLEyeCameraColorMode mode, CLEyeCameraResolution resolution, float fps);
RenderThread();
~RenderThread();
bool StartCapture();
signals:
void sendText(QString &text);
protected:
void run();
private:
QMutex mutex;
QWaitCondition condition;
//some more private variables for construction
};
我认为这种创作似乎有些不对:RenderThread *thread = new RenderThread(this);
答案 0 :(得分:2)
首先担心的问题是“RenderThread”这个词。请注意,Qt仅允许在主线程上进行渲染。您可以创建单独的线程来计算图像数据,但无论何时使用画家和绘制对象,都必须在主线程上进行。但是,如果您要捕获图像并通过信号和插槽将其传递给主线程,那么这应该没问题。
其次,虽然你没有显示所有代码,但我假设从函数RenderThread :: run()和Qt示例中你可能已经从QThread继承。如果是这种情况,请注意这不是如何使用QThread。相反,您应该让您的类继承自QObject并将其移动到QThread。您可以阅读有关如何use QThread properly here。
的内容我知道这是你跟随过的Qt例子,但即便是Qt的人也认为这是一个坏主意。 Here's an article如何真正使用QThreads。
考虑到这一点,这里是我将如何使用QThread的概述: -
class CameraWindow : public QDialog
{
private:
CameraObject* m_pCamObject;
};
class CameraObject : public QObject
{
Q_OBJECT
public:
private slots:
startCaptureThread();
private:
};
int CameraWindow::startCaptureThread()
{
m_pCamObject = new CameraObject;
QThread* pThread = new QThread;
this->moveToThread(pThread); // CameraObject will run on the new thread
connect(pThread, SIGNAL(started()), m_pCamObject, SLOT(startCaptureThread()));
connect(pThread, SIGNAL(finished()), pThread, SLOT(deleteLater()); // clear up when
完成
pThread->start();
}
请注意,这是一个CameraObject,与CameraWindow分开。 QThread只是线程的控制器,与CameraObject保持清晰的分离。
以这种方式处理线程的另一个原因是您可以将多个QObject实例移动到新线程,而不是总是为每个对象创建一个新线程。如果你的线程多于CPU核心,那么你不可能通过创建另一个线程获得收益。
答案 1 :(得分:0)
在CameraWindow类的构造函数中,您正在连接RenderThread的信号,但它与startCaptureThread中启动的对象不同。像这样更改你的startCaptureThread:
int CameraWindow::startCaptureThread()
{
thread.StartCapture(); //starts thread in low priority and sets _running to true
}
在此方法中,CameraWindow的线程成员已启动。
P.S。:也发布标题,我们无法从此代码中看到成员。
答案 2 :(得分:-1)
在上述示例中,CameraWindow
类包含RenderThread thread
变量,而不是RenderThread *thread
。
您正在连接呼叫中连接指针地址:
connect(&thread, SIGNAL(sendText(std::string)),
this, SLOT(debugSomething(std::string)));
尝试使用好地址:
connect(thread, SIGNAL(sendText(std::string)),
this, SLOT(debugSomething(std::string)));
这不是经过测试的答案。