• 9307阅读
  • 14回复

我要在线程里完成很多事~然后主界面上显示进度~怎么搞?? [复制链接]

上一主题 下一主题
离线dancindream
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-18
主界面上有
两个 QLabel 一个 QProgressBar

1、
我本来打算 在QThread里的run里
emit一个signal到主界面上
可是run里的emit主界面不响应
我想知道该怎么办????

2、
我退而求其次
我把主界面的2个QLabel和1个QProgressBar的指针传给线程
LABEL可以setText
但是
QProgressBar却SetValue(int)出错
线程里要如何使用QProgressBar?????

好心的朋友帮我回答下这两个疑惑把~~~~
离线dbzhang800

只看该作者 1楼 发表于: 2009-11-18
放弃第二种想法,第一种应该没问题,可以详细描述一下你遇到的问题。
离线dancindream

只看该作者 2楼 发表于: 2009-11-18
第二种也是权宜之计
子线程里去操作主进程的UI本来就是限制的
现在至少能显示当前在干什么,只是无法显示进度

第一种代码是这样

void SaveDeviceThread::run()
{
    SaveNowInfo(L"Save List", L"Save " + name, 10/*进度*/, 1);

    mutex.lock();
    //保存文件
    //.........
    mutex.unlock();

    index += skip;
    SaveNowInfo(L"Save List", L"Save " + name, , 10 /*进度*/, 0);
}


void SaveDeviceThread::SaveNowInfo( wstring saveObject, wstring saveContent, int nProgress, int nStatue )
{
    emit SendSaveInfo(saveObject, saveContent, nProgress, nStatue);
}

我在除run以外的函数里调用SaveNowInfo,都是可以把signal发出去的~~,惟独在run里不行
离线yb824
只看该作者 3楼 发表于: 2009-11-18
run 函数最后加上exec(); 呢
离线snailbing

只看该作者 4楼 发表于: 2009-11-19
用第一种方法比较好,我就是用第一种方法的,QThreadPool 调用的 QRunnable 的 run 函数中 emit 一个信号,通知 Qapp 所在的主线程说这个线程已经完成运行。
离线dancindream

只看该作者 5楼 发表于: 2009-11-19
线程完成有一个
finished() signal
不需要自己emit
离线dancindream

只看该作者 6楼 发表于: 2009-11-19
run 函数最后加上exec(); 呢


方法貌似不行
我在最后加了
signal没有发出去
run函数结束时
就阻塞在exec函数上了
离线dancindream

只看该作者 7楼 发表于: 2009-11-19
我在
mandelbrot事例里看到它的QThread是可以直接emit一个signal出来的
我的线程是完全模仿它写的
我的emit外面就接不到
为什么????
离线yb824
只看该作者 8楼 发表于: 2009-11-19
试了,是能收到的,看下你的connect是不是有问题
离线dancindream

只看该作者 9楼 发表于: 2009-11-19
connect没有问题~~~
线程里的其他 非run函数 emit 都是正常的
仅仅是run函数里emit不响应
有遇到这样情况的吗???
离线yb824
只看该作者 10楼 发表于: 2009-11-19
试一下注册std::wstring
qRegisterMetaType<std::wstring>( "std::wstring" );
需要头文件#include <QMetaType>
离线dbzhang800

只看该作者 11楼 发表于: 2009-11-19
引用第9楼dancindream于2009-11-19 12:36发表的  :
connect没有问题~~~
线程里的其他 非run函数 emit 都是正常的
仅仅是run函数里emit不响应
有遇到这样情况的吗???


如果不方便贴代码,可以新建一个最小的能反映问题的工程,贴附件里面
离线dancindream

只看该作者 12楼 发表于: 2009-11-19
问题应该是没有注册类型~~
我去掉wstring类型就可以响应
我准备使用QString替代wstring~~~
离线spitbreak
只看该作者 13楼 发表于: 2010-12-31
引用第4楼snailbing于2009-11-19 09:39发表的  :
用第一种方法比较好,我就是用第一种方法的,QThreadPool 调用的 QRunnable 的 run 函数中 emit 一个信号,通知 Qapp 所在的主线程说这个线程已经完成运行。

QRunnable 不是QObject的子类,不能emit signal
离线dunniu

只看该作者 14楼 发表于: 2010-12-31
是不是忘了加 Q_OBJECT
快速回复
限100 字节
 
上一个 下一个