qt 如何在循环运行时,使用一个与循环无关的函数,改变循环内的参数
没仔细学过线程,不知道该具体描述这个问题,,,
class WLI_Mess : public QMainWindow
{
Q_OBJECT
public:
WLI_Mess(QWidget *parent = 0);
~WLI_Mess();
algo_phase32 algo;
Ui::WLI_MessClass ui;
}
这是包含了ui的那个类
另外algo_phase32这个类里面有个函数run(),run()里面有个for循环,循环里每一步都要判断一下stop是否为真
class algo_phase32: public QThread
{
Q_OBJECT
public:
bool stop;
void run();
}
ui上有个stop按键,按了之后algo.stop=false
;
我在WLI_Mess的某个函数里面引用了 algo.run()
现在问题是,在run运行的时候,我按stop键,algo.stop的值不会变。。。等algo.run()
运行完之后,这个值才改变。。。
想请问一下,有什么方法能够一按stop,值就能改变吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
没太看明白……
首先,QThread虽然可以重写Run来实现线程,不过Qt对QThread的定位并不是这样,而是把QThread当作一个事件循环,建立一个QThread对象,把某个QObject使用moveToThread移动到该QThread,这样可以使这个QObject在主线程之外的事件循环中运行。
第二,QThread的启动方法是调用start,而非run。调用run实际上就是在你调用的线程运行run这个函数,并没有开出新线程。
第三,这里假设你调用run的地方是某个在主线程运行的slot,而按钮的slot也是在主线程运行的slot,这样这两个slot实际上是串行执行,那么就会发生run执行完成了stop才改变的现象。解决办法就是在某一个地方调用一下start,而不要反复调用run
第四,这种情景推荐用一下Boost的thread。它有一个interrupt方法,可以在boost::sleep_for(...)等可中断函数的地方终端,而不用使用手写的某个变量来控制
尝试一下把algo_phase32类中的stop变量声明为:
bool volatile stop;
你的algo_phase32类的线程通过判断stop来作为线程退出的标志,但编译器会对stop进行优化,特别是在循环里面,所以即使其他线程改了stop标志,循环里面还是用的旧的stop的值,为了避免这个问题,可以把这种类型的变量声明为volatile,这样编译不会对它进行优化,而是在每次访问它的时候,都重新从内存拿出它的最新的值,而不是用CPU寄存器里暂存的值。