• 12656阅读
  • 10回复

qt线程异常退出 [复制链接]

上一主题 下一主题
离线wjz2047
 

只看楼主 倒序阅读 楼主  发表于: 2013-11-16
先贴一段代码:(checkThread、myThread是我自己创建的线程)

        checkThread *ckthread = new checkThread;
    connect(ckthread, SIGNAL(notifymain(QString)), this, SLOT(testwjz(QString)));
    ckthread->start();
    myThread *bundlthread = new myThread;
    bundlthread->start();
两个线程我都重写了他们的run函数。

void checkThread::run()
{

while(true)
    {
    sleep(3);
    emit notifymain("This is the son thread");
    }

    exec();
}

void MainWindow::testwjz(QString s)
{
    qDebug()<<s;
}
问题估计出在第二个线程:我先这样重写它的run函数的。

void myThread::run()
{
    while(true)
    {
          qDebug()<<"Thread is running!";
          sleep(3);
    }
    exec();  
}
程序运行正常。
然后我改了一下:

void myThread::run()
{
    BundlerApp::RunBundler();//调用了一个算法
    exec();  
}
然后出现错误

"This is the son thread"
"This is the son thread"
线程 'Win32 线程' (0x143c) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x2ad4) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x2054) 已退出,返回值为 0 (0x0)。
线程 'checkThread' (0x2868) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x1c54) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x2a14) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0xbe8) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x1e60) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x2698) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x2aa4) 已退出,返回值为 0 (0x0)。
Detected memory leaks!
Dumping objects ->
{943782} normal block at 0x12010768, 11 bytes long.
Data: <           > 01 01 01 01 00 01 00 01 01 01 01
{943775} normal block at 0x12044D38, 336 bytes long.
Data: <    r   d   i   > B4 01 00 00 72 01 00 00 64 02 00 00 69 01 00 00
{943771} normal block at 0x12046710, 336 bytes long.
Data: <r       i   d   > 72 01 00 00 B4 01 00 00 69 01 00 00 64 02 00 00
{943737} normal block at 0x12045C18, 752 bytes long.
Data: <    8   d       > B4 01 00 00 38 01 00 00 64 02 00 00 A1 01 00 00
{943733} normal block at 0x120491F8, 752 bytes long.
Data: <8           d   > 38 01 00 00 B4 01 00 00 A1 01 00 00 64 02 00 00
{943333} normal block at 0x12050FA0, 1128 bytes long.
Data: <        3   b   > B7 00 00 00 F8 00 00 00 33 01 00 00 62 01 00 00
{943329} normal block at 0x12047C70, 1128 bytes long.
Data: <        b   3   > F8 00 00 00 B7 00 00 00 62 01 00 00 33 01 00 00
{943229} normal block at 0x12012180, 1128 bytes long.
Data: <        3   a   > B7 00 00 00 F2 00 00 00 33 01 00 00 61 01 00 00
{943120} normal block at 0x12044890, 1128 bytes long.
Data: <r   0   w   :   > 72 01 00 00 30 01 00 00 77 01 00 00 3A 01 00 00
{943116} normal block at 0x12050AF8, 1128 bytes long.
Data: <0   r   :   w   > 30 01 00 00 72 01 00 00 3A 01 00 00 77 01 00 00
{942938} normal block at 0x1204EA00, 752 bytes long.
Data: <r       w   <   > 72 01 00 00 03 01 00 00 77 01 00 00 3C 02 00 00
{942706} normal block at 0x12048350, 1688 bytes long.
Data: <                > AD 00 00 00 B0 00 00 00 F8 00 00 00 F2 00 00 00
{942474} normal block at 0x12050420, 1688 bytes long.
Data: <                > EB 00 00 00 A6 00 00 00 F3 00 00 00 B1 00 00 00

离线wjz2047

只看该作者 1楼 发表于: 2013-11-16
我感觉问题出在我调用的算法 BundlerApp::RunBundler()里,大家怎么看呢?
离线wjz2047

只看该作者 2楼 发表于: 2013-11-17
我有预感这帖子要沉
离线toby520

只看该作者 3楼 发表于: 2013-11-17
此事必有蹊跷,应该是算法方法使用后出现的问题,你也可以while(true)里面来使用算法
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线XChinux

只看该作者 4楼 发表于: 2013-11-17
楼主将Qt线程用错了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线dbzhang800

只看该作者 5楼 发表于: 2013-11-18
可能楼主刚开始接触多线程编程,建议先多看看Qt自带的文档。

以及exec() 做什么用的,等等
离线wjz2047

只看该作者 6楼 发表于: 2013-11-19
回 5楼(dbzhang800) 的帖子
多谢指导,我刚开始接触多线程编程
离线wjz2047

只看该作者 7楼 发表于: 2013-11-19
回 3楼(toby520) 的帖子
我试过了,单独跑那个算法,也存在内存泄露,现在解决了
离线wjz2047

只看该作者 8楼 发表于: 2013-11-19
回 4楼(XChinux) 的帖子
这话怎么说,这样用有什么问题吗?
离线XChinux

只看该作者 9楼 发表于: 2014-01-26
使用QThread,关键是让你的程序进入消息循环(即exec()),在里面进行任务调度、循环什么的,这才能充分利用Qt信号、槽的特性。
如果没有进入exec(),那你中间的任何信号、槽相关的东西都无效的。
如果线程只是执行一个单独的过程,无信号、槽交互,那你直接用QtConcurrent::run()多方便。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线noidea

只看该作者 10楼 发表于: 2014-01-27
第一次你没有跑  `BundlerApp::RunBundler();` 可以运行,说明你两个线程都是互相独立,没有发生资源冲突。 第二次你调用static方法 `BundlerApp::RunBundler()` 出现问题,很可能你发生了资源竞争,而且你没有锁住资源占用,或者本身算法就有问题。

对于你的多线程用法,在Qt4.x和以前的书都是从QThread中继承,然后实现run方法。
其实这已经是过时或者不推荐的用法了,在Qt5.2里边已经明确给出了从QObject里边继承。这样的好处处多多,尤其是你在实现SINGAL/SLOT时候,即跨线程通信是非常方便的。

具体请参考 http://qt-project.org/doc/qt-5/qthread.html#details
4条评分好评度+1贡献值+1金钱+10威望+1
XChinux 好评度 +1 - 2014-01-27
XChinux 贡献值 +1 - 2014-01-27
XChinux 威望 +1 - 2014-01-27
XChinux 金钱 +10 - 2014-01-27
talk in code
Qt5.2.1 + MacOSX10.9
快速回复
限100 字节
 
上一个 下一个