我正在开发一个基于桌面(Windows 7)的应用程序,并使用QtCreatorv5.6.0开发该程序。我有一个很奇怪的问题。
项目背景:我的项目包括从系统通信端口连接的设备读取数据,并将数据传输到MainWindow UI以显示。因为要与通信端口通信,我们必须使用第三方库,所以我不使用QtSerial端口类,这是非常简单和容易使用的。
代码设计:类MainClass :在这个类中,我们创建了一些表单来显示从设备读取的数据。
类TestClass:该类将处理与系统串口连接的设备的所有通信,并使用第三方库。该类还具有while循环,用于从连接在串口的设备中读取数据。
因为正在使用while循环。因此,我们决定在不同的线程中运行一个测试类。
在MainClass构造器中创建线程的代码:
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)));
}
}碰撞代码:
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()的原型
bool func1 (const char portDescription[], uInt32 param2,
uInt16 length, Int16 * portNr);因为,func1()是库代码的一部分。因此,我无法检查函数func1()的定义。我可以保证,func1()中没有问题,因为它正在不同的基于java的项目中使用,并且可以工作。
我在这个项目上做了更多的调试,并注意到当在调试模式下运行BreakPoints时,比在窗口中,我可以看到我已连接的插槽,但是当我不放除代码崩溃之外的任何breakPoint时,在窗口中,我看不到连接的插槽
因此,研究了openPort插槽的主类和测试类之间的连接问题。
但是,当我在operPort()函数中放置断点时,我不能像在窗口中看到我的openPort插槽那样理解taht,但是在窗口和Program中看不到比openPort插槽更多的断点。
请建议,
发布于 2016-09-12 14:54:48
我可以保证,func1()中没有问题,因为它正在不同的基于java的项目中使用,并且可以工作。
等等,func1()是C++还是Java?
还有,你怎么能确定它能起作用?
获取库源代码,自己编译,并在其中进行调试。
而且,为了确保,在调试时检查变量的值,在不调试时检查变量的qDebug()值
发布于 2016-09-16 12:04:47
我为在我自己的帖子上回复而道歉,但在对StackOverflow和google进行了多次争论之后。我解决了这个问题。
为了解决这个问题:我更改了插槽(OpenPort),如下所述:
Connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)), Qt::DirectConnection); 即使用"Qt:DirectConnection“方法。如果不指定连接方法,则直接方法将自动用于同一线程上的对象之间的连接。从这里开始,我们为TestClass创建了一个新的TestClass,并使用了一个可能不是线程安全的thirdParty库。因此,使用"Qt::DirectConnection“使openPort() SlOT在MainClass线程中运行。基本上,就像发出信号时直接调用插槽方法一样。
https://stackoverflow.com/questions/39451940
复制相似问题