• 3921阅读
  • 3回复

奇怪的崩溃问题(已解决) [复制链接]

上一主题 下一主题
离线米尔利安
 

只看楼主 倒序阅读 楼主  发表于: 2011-05-09
如题。我使用新开启的一个线程进行耗时代码,用信号和槽连接GUI线程和工作线程。

在主界面的构造函数中启动工作线程并连接信号和槽:

  workThread = new QThread();
    worker = new Updater();
    worker->setUI(ui);
    worker->moveToThread(workThread);
    workThread->start();

    connect(this,SIGNAL(startUpdate(char*, char*)),worker,SLOT(startUpdate(char*, char*)));
    connect(worker,SIGNAL(finishUpdate(long)),this,SLOT(finishUpdate(long)));


在点击按钮后发射startUpdate信号:

void MainWindow::on_update_pushButton_clicked()
{
         ……
     out<<"leaving GUI thread"<< "\r\n"; //这一句打印出来了
    logfile.close();
    
    emit startUpdate(fileName, password);
}

对应的槽:

void Updater::startUpdate(char* fileName, char *password)
{
    isWorking = true;

    QFile logfile("log.txt");
    if (!logfile.open(QIODevice::Append))
        return;
    QTextStream out(&logfile);

    out<<"into work thread" << "\r\n"; //这句没有打印出来

    long ret = UpdateUniKey(fileName, password); 

    ……
}


该代码在本机上执行没有问题。在另一台机器上运行时,程序偶尔会崩溃。崩溃时,发射信号之前的那句信息打印出来了,但是槽函数里的没有打印出来。而这个崩溃出现的毫无规律,所以没办法调试。

有人知道这个崩溃是怎么回事吗?谢谢!
[ 此帖被米尔利安在2011-05-09 18:01重新编辑 ]
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线morriszy

只看该作者 1楼 发表于: 2011-05-09
我也这样使用的,一点问题没有呀
worker->setUI(ui);
应该写在构造函数里面吧
[ 此帖被morriszy在2011-05-09 17:05重新编辑 ]
VS2010+Qt4.7.0
离线米尔利安

只看该作者 2楼 发表于: 2011-05-09
问题找到了。
发射的信号参数是两个字符串指针,而这两个数组是在发射信号的参数中分配的空间。
结果信号发射出去之后,函数结束,这个空间就挂掉了。而在工作线程中还用这个指针来取东西,所以程序崩了。
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线oscarboycn

只看该作者 3楼 发表于: 2011-05-28
那最好是new出来,分配在堆上
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
快速回复
限100 字节
 
上一个 下一个