• 14394阅读
  • 13回复

请教:Qt中的多线程编程 [复制链接]

上一主题 下一主题
离线天外飞仙
 
只看楼主 正序阅读 楼主  发表于: 2007-06-26
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
请教: 下面是完成文件的载入和保存的程序:
Bool Spreadsheet::writeFile(const QString &filename){
      QFile file(filename);
      ……
      for(int row=0;row<NumRows;++row){
        for(int col=0;col<NumCols;++col){
          QString str=formula(row,col);
          if(!str.isEmpty())
            out<<(Q_UINT16)row<<
              (Q_UINT16)col<<str;
        }
      }
      QApplication::restoreOverrideCursor();
return true;
  }
从此程序在执行来看,只有等到把文件一直保存到完毕,窗口系统产生的一些事件才会被处理。在保存过程中,这个应用程序就不能响应窗口系统的请求来重新绘制自己。对这一问题若采用多线程的方式解决的话,那么一个处理应用程序用户界面的线程,另外一个执行文件保存的线程。但具体该怎样编程? 望各位高手不吝赐教!
[ 此贴被天外飞仙在2007-06-27 08:47重新编辑 ]
离线evoleci
只看该作者 13楼 发表于: 2008-12-12
恩,感谢关注!

机器系统挂掉了,装完软件就去试试
我们只是在经历着一些事情。
离线water_wf

只看该作者 12楼 发表于: 2008-12-10
稳定行不用担心吧,操作系统负责的,调用正确的接口即可
效率的话,主要看线程负责什么操作了,毕竟new线程也是很浪费时间的,如果线程任务繁重,绝对值得
离线succulent
只看该作者 11楼 发表于: 2008-12-10
可以的,主线程发送信号到子线程完全没问题,反过来就行
但多线程的效率和稳定性如何,我就没太深入分析过了
有高手这方面的造诣比较深
希望能来做个全面的探讨
离线evoleci
只看该作者 10楼 发表于: 2008-12-10
借用楼主的宝地,最近初学QT, 使用版本为QT4.1;

手头有个例子和楼主有相似之处,同样是想用多线程编程。
主线程负责人机对话部分,即提供相应的界面操作,子线程负责文件的读取、拆分包等,
想采用信号和槽函数的方式来处理主线程和子线程之间的通信,即当主线程的界面上按下相应按键,产生信号,子线程中槽函数
接收信号并相应,完成文件的读取等操作,同时通过发送信号到主线程让主线程显示文件的读取进度;

现请问各位QT前辈,这样的实现机制是否能行,记得在QT4.1帮助文档中的Blocking Fortune Client Example多线程例子中,发现主线程和子线程中用到信号和槽函数机制的时候,信号都是从子线程中发出的,主线程的槽函数进行相应,主线程并没有发出过让子线程槽函数相应的信号,现在比较迷惑的是:是帮助文档中的例子未用到主线程发出信号的实现方式,还是主线程就是不能发出让子线程相应的信号呢??

特请教,谢谢!!
我们只是在经历着一些事情。
离线eagercake

只看该作者 9楼 发表于: 2008-12-09
重载thread的run方法。thread->start()会调用你重载的run
No pain, No gain
离线XChinux

只看该作者 8楼 发表于: 2007-07-10
引用第7楼nanjinghu于2007-07-10 09:32发表的  :
QT线程中不能有UI界面对象吧?


可以有的吧,我这里就用过。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线nanjinghu
只看该作者 7楼 发表于: 2007-07-10
QT线程中不能有UI界面对象吧?
离线天外飞仙
只看该作者 6楼 发表于: 2007-06-30
大家帮帮忙啦!说几句吧!
离线天外飞仙
只看该作者 5楼 发表于: 2007-06-28
谢谢4楼的朋友,你的方法不错!我会记下的。不过,因为特殊需要,要采用多线程的方式解决,即:一个线程负责处理应用程序用户界面响应,另外一个线程执行文件保存。那么具体该怎样编程? 望各位不吝赐教! 说不好没关系,只要你开口,就是朋友!
离线jedychen

只看该作者 4楼 发表于: 2007-06-28
觉得可以用QProgressDialog:
  uint nCount = file.lines();
    QProgressDialog progress("Reading ...","Abort",100,
                          qApp->mainWidget(), "progress", TRUE );
    progress.setProgress(0);
    qApp->processEvents();
    for(uint i=1; i<=nCount; i++)
    {
        if( i%(nCount / 100)==0)
        {
            progress.setProgress( i );
            qApp->processEvents();

            if ( progress.wasCanceled() )
            {
                bOk= false;
                break;
            }
        }//end if
        读文件的一行。。。
    }//end for
程序应该有点错误,大概意思是这样的。
离线天外飞仙
只看该作者 3楼 发表于: 2007-06-27
大家帮帮忙啦!都来说两句啊,兄弟急用阿!
离线天外飞仙
只看该作者 2楼 发表于: 2007-06-27
谢谢,若能再具体些就好了!
离线zeki709

只看该作者 1楼 发表于: 2007-06-26
使用QThread的run()函数中,在主线程中使用start()函数启动
快速回复
限100 字节
 
上一个 下一个