首页 > qt 如何在循环运行时,使用一个与循环无关的函数,改变循环内的参数

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,值就能改变吗?


尝试一下把algo_phase32类中的stop变量声明为:
bool volatile stop;
你的algo_phase32类的线程通过判断stop来作为线程退出的标志,但编译器会对stop进行优化,特别是在循环里面,所以即使其他线程改了stop标志,循环里面还是用的旧的stop的值,为了避免这个问题,可以把这种类型的变量声明为volatile,这样编译不会对它进行优化,而是在每次访问它的时候,都重新从内存拿出它的最新的值,而不是用CPU寄存器里暂存的值。


没太看明白……
首先,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(...)等可中断函数的地方终端,而不用使用手写的某个变量来控制

【热门文章】
【热门文章】