• 7255阅读
  • 3回复

重新start()子线程的时候,出现QMutex::lock()出错提示信息 [复制链接]

上一主题 下一主题
离线evoleci
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-06
— 本帖被 XChinux 执行加亮操作(2009-01-08) —
还是那个该死的segmentation fault(段错误),不过此次出现的位置发生变化;

大致介绍:小弟现在做一个可以在linux操作系统下运行的 文件传送客户端程序;就是将linux操作系统下的文件通过网口发送给相应的终端设备,主要用途是给嵌入式终端设备做升级维护;

实现方案:主线程主要负责界面显示,即人机交互;子线程负责建立通信通道,拆分包等

现遇到问题:在主线程按下“连接”按键时,启动子线程,并开始建立通信通道,若通信通道建立不成功,发送失败信号到主线程(signal/slot通信机制),主线程响应并弹出“连接失败”信息框;关掉弹出框后,重新按下界面“连接”按键时,问题出现了!!!!!

用gdb跟踪调试时发现,在子线程重新启动即start()时
出现
segmentation fault (段错误)
0x409bb030 in QMutex::lock() () from /usr/local/Trolltech/Qt-4.2.3/lib/libQtCore.so.4
提示信息!!


现请教各位,此种错误问题有可能在哪儿?
谢谢!
我们只是在经历着一些事情。
离线try_uucall
只看该作者 1楼 发表于: 2009-01-06
是不是没有释放连接
离线evoleci
只看该作者 2楼 发表于: 2009-01-07
to:try_uucall

没有释放连接?不是很明白,您能给说具体点儿吗?

另:跟踪调试的时候发现,当子线程向主线程发出“建立通信通道出错信号”的时候,程序转到主线程运行,然后主线程弹出“出错提示框”,然后手动点击关掉“出错提示框”后,整个程序好像在等待,是不是我线程同步的问题?这个地方不知道该怎么处理?在点击“连接”按键启动子线程的时候我做过if(!isRunning)的判断,发现第二次的时候,子线程是被干掉的,我却不知道我的程序什么时候把子线程给干掉的,这个地方思维有点儿乱,望高人指点一二!

谢谢
我们只是在经历着一些事情。
离线evoleci
只看该作者 3楼 发表于: 2009-01-07
问题已解决,但是自己都不知道怎么解决的,只是在子线程的while循序里面加了个QMutex锁,然后在一次循环结束前unlock()掉;


原来子线程的run()是这样的:
void ProcessThread :: run()
{
    while(!quit)
    {
        mutex.lock();
        ......
        ......
        mutex.unlock();
        cond.wait(&mutex)
    }
}
现在改成:
void ProcessThread :: run()
{
    while(!quit)
    {
        mutex.lock();
        ......
        ......
        cond.wait(&mutex)
        mutex.unlock();
    }
}
就好使了
小弟就是个半吊子;
烦请在这个地方理解透彻的NN们给个解释

谢谢!
[ 此贴被evoleci在2009-01-07 11:15重新编辑 ]
我们只是在经历着一些事情。
快速回复
限100 字节
 
上一个 下一个