首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QThread :程序在调试模式下崩溃,但在发布模式和调试模式下运行,并为基于QThread的程序设置断点。

QThread :程序在调试模式下崩溃,但在发布模式和调试模式下运行,并为基于QThread的程序设置断点。
EN

Stack Overflow用户
提问于 2016-09-12 13:51:58
回答 2查看 2.6K关注 0票数 2

我正在开发一个基于桌面(Windows 7)的应用程序,并使用QtCreatorv5.6.0开发该程序。我有一个很奇怪的问题。

  1. 我的程序在调试模式下崩溃,但在发布模式下工作正常。
  2. 如果在调试模式下,并且我设置了断点来查找崩溃的原因,那么它不会崩溃:它正常工作。但是,如果我不放置任何断点,那么它就会在下面的代码中崩溃:

项目背景:我的项目包括从系统通信端口连接的设备读取数据,并将数据传输到MainWindow UI以显示。因为要与通信端口通信,我们必须使用第三方库,所以我不使用QtSerial端口类,这是非常简单和容易使用的。

代码设计:类MainClass :在这个类中,我们创建了一些表单来显示从设备读取的数据。

类TestClass:该类将处理与系统串口连接的设备的所有通信,并使用第三方库。该类还具有while循环,用于从连接在串口的设备中读取数据。

因为正在使用while循环。因此,我们决定在不同的线程中运行一个测试类。

在MainClass构造器中创建线程的代码:

代码语言:javascript
复制
MainClass::MainClass (QWidget *parent) : QDialog(parent),
    ui(new Ui::Analzyer)
{
   ............................
   ............................

   workerThread = new QThread;
   testClassObject = new TestClass();   // Declared in HeaderFile of MainClass        

    if((workerThread != NULL) && (testClassObject != NULL))
    {
        workerThread ->moveToThread(testClassObject );

        connect(workerThread , SIGNAL(started()), testClassObject, SLOT(SomeFunc()));
        connect(testClassObject, SIGNAL(exit()), workerThread , SLOT(quit()));
        connect(testClassObject, SIGNAL(exit()), testClassObject,  SLOT(deleteLater()));
        connect(workerThread , SIGNAL(finished()), workerThread , SLOT(deleteLater()));

        // connectToPort Signal is emitted when User clicks the pushbutton from   // Main class UI
        connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)));
    }

}

碰撞代码:

代码语言:javascript
复制
void TestClass::openPort(const QString portName)
{
    // Here portName is say : "Appliance Interface v2"
    quint32 param2 = getParam2ForPortName(portName);
    qint16 portNumber = 0;

    QByteArray portNameByteArray = portName.toLatin1();

    const char *portNameToOpen = portNameByteArray.data();

     // Program crashed when return from this function
    if(func1(portNameToOpen , param2, 10 , &portNumber) == true)
    {
             ......................
             ......................
    }
}

在这里,我添加了一些qDebug(),发现我的代码在从func1()返回或调用在槽OpenPort()中被调用时崩溃。下面是func1()的原型

代码语言:javascript
复制
bool func1 (const char portDescription[], uInt32 param2,
               uInt16 length, Int16 * portNr);

因为,func1()是库代码的一部分。因此,我无法检查函数func1()的定义。我可以保证,func1()中没有问题,因为它正在不同的基于java的项目中使用,并且可以工作。

我在这个项目上做了更多的调试,并注意到当在调试模式下运行BreakPoints时,比在窗口中,我可以看到我已连接的插槽,但是当我不放除代码崩溃之外的任何breakPoint时,在窗口中,我看不到连接的插槽

因此,研究了openPort插槽的主类和测试类之间的连接问题。

但是,当我在operPort()函数中放置断点时,我不能像在窗口中看到我的openPort插槽那样理解taht,但是在窗口和Program中看不到比openPort插槽更多的断点。

请建议,

EN

回答 2

Stack Overflow用户

发布于 2016-09-12 14:54:48

我可以保证,func1()中没有问题,因为它正在不同的基于java的项目中使用,并且可以工作。

等等,func1()是C++还是Java?

还有,你怎么能确定它能起作用?

获取库源代码,自己编译,并在其中进行调试。

而且,为了确保,在调试时检查变量的值,在不调试时检查变量的qDebug()值

票数 0
EN

Stack Overflow用户

发布于 2016-09-16 12:04:47

我为在我自己的帖子上回复而道歉,但在对StackOverflow和google进行了多次争论之后。我解决了这个问题。

为了解决这个问题:我更改了插槽(OpenPort),如下所述:

代码语言:javascript
复制
Connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)), Qt::DirectConnection); 

即使用"Qt:DirectConnection“方法。如果不指定连接方法,则直接方法将自动用于同一线程上的对象之间的连接。从这里开始,我们为TestClass创建了一个新的TestClass,并使用了一个可能不是线程安全的thirdParty库。因此,使用"Qt::DirectConnection“使openPort() SlOT在MainClass线程中运行。基本上,就像发出信号时直接调用插槽方法一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39451940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档