首页| 论坛| 消息

标题:如何在线程运行中,弹出对话框让用户选择,并暂停线程
作者:stlcours
日期:2016-09-04 05:45
内容:

就好比有一个线程在拷贝很多文件,但是忽然发现有一个文件已经存在了,请用户确认是否覆盖,此时需要弹出对话框,并暂停线程(Windows拷贝文件就是这样的)。
等到用户选择了yes或者no之后,继续进行拷贝。这种情况应该如何写代码?

我考虑使用如下方案:

if (文件已经存在) {
lock;
emit 信号; // 让GUI弹出一个对话框
lock; // 此时必定卡住,因为前面已经锁过一次了
}
然后在用户点击确认按钮后,两次解锁,不知道这种方案可行吗?大家有没有什么更好的方案?因为我觉得主动连续两次上锁怪怪的,从来只见过一次上锁。


#1 [ysu533 09-04 06:35]
这里为什么要上锁,个人觉得不但不需要2个锁,一个都不是必要的,这个线程除了拷贝,要干什么了?
另外你线程是怎么写的? movetothread,还是什么?
#2 回 ysu533 的帖子 [stlcours 09-04 13:43]
ysu533:这里为什么要上锁,个人觉得不但不需要2个锁,一个都不是必要的,这个线程除了拷贝,要干什么了?
另外你线程是怎么写的? movetothread,还是什么?
 (2016-09-04 06:35) 
我在网上搜了一下,都是使用锁,或者用变量进行空循环进行控制。我这线程,就是挨个拷贝文件啊,没有干别的事情。但是是否覆盖原有的文件,总该问问吧。
另外,我这线程就是继承QThread,没有采用movetothread。最近努力学习movetothread方法,可总是感觉不适应,不知道为什么这种方法却是官方的推荐方法?
#3 回 stlcours 的帖子 [ysu533 09-04 13:53]
stlcours:我在网上搜了一下,都是使用锁,或者用变量进行空循环进行控制。我这线程,就是挨个拷贝文件啊,没有干别的事情。但是是否覆盖原有的文件,总该问问吧。
另外,我这线程就是继承QThread,没有采用movetothread。最近努力学习movetothread方法,可总是感觉不适应,不知道为什么这 .. (2016-09-04 13:43)
官方文档早改了,继承不是不能用啊,movethread更简单啊, 一会我简单的给你写个
#4 [ysu533 09-04 14:12]
加入copy对像是你用来执行拷贝操作的,
QThread * thread = new QThread();
copy->moveToThread(thread);
thread->start();
connect(copy, SIGNAL(fileExist()), xx, SLOT(XXXX()));
copy->start(files); 开始拷贝文件
---------------------
void Copy::start(const QStringList &files)// 开始拷贝这些文件
{
QTimer::singleShot(0, this, SLOT(copy())); // 这里不执行实际拷贝,通过信号槽间接调用 copy
}
void Copy::copy(const QStringList &files)
{
foreach(QString file, files) {
if(存在) {
emit fileExist(file);
break;
} else {
拷贝文件
}
emit copyFinished();
}
}

这样就不用考虑跨线程的问题了。
#5 [stlcours 09-04 15:19]
谢谢你辛苦写了这么多代码,但是没有回答到问题的实质。emit fileExist(file)以后,是应该要把线程暂停住(卡住?),等待用户选择后再进行下一步的操作。你如何保证这一点呢?

<< 1 2 3 >> (1/3)

回复 发表
主题 版块