C++ QThread::msleep()冻结程序

C++ QThread::msleep()冻结程序,c++,multithreading,qt,qthread,qtcore,C++,Multithreading,Qt,Qthread,Qtcore,当用户保存游戏时,我试图在我的QLabel之一上创建淡入淡出效果 因此,我认为使用QThread将非常适合这项工作,但唯一的问题是QThread::msleep()冻结程序 我以前多次使用这种技术来减慢循环速度,但现在它决定冻结我的程序,直到循环结束 有人知道这里发生了什么吗 我删除了所有不相关的东西,因为这个程序非常庞大 保存 #如果已保存# #定义保存的\u H #包括 已保存的类:公共QThread { Q_对象 公众: 显式保存(QObject*parent=0); 无效运行(); 信号

当用户保存游戏时,我试图在我的
QLabel
之一上创建淡入淡出效果

因此,我认为使用
QThread
将非常适合这项工作,但唯一的问题是
QThread::msleep()冻结程序

我以前多次使用这种技术来减慢循环速度,但现在它决定冻结我的程序,直到循环结束

有人知道这里发生了什么吗

我删除了所有不相关的东西,因为这个程序非常庞大

保存
#如果已保存#
#定义保存的\u H
#包括
已保存的类:公共QThread
{
Q_对象
公众:
显式保存(QObject*parent=0);
无效运行();
信号:
无效还原性(无符号短路);
公众时段:
};
#endif//SAVED\u H
saved.cpp
#包括“saved.h”
已保存::已保存(QObject*父对象):
QThread(父线程)
{
}
已保存void::run(){
无符号短alpha=250;
for(无符号短i=0;i setupUi(此);
//QThread
保存=新保存的(此);
连接(保存、信号(可还原性(无符号短))、此、插槽(动画保存(无符号短));
}
MainWindow::~MainWindow()
{
删除用户界面;
}
//钮扣
void main window::在单击时保存(){
QFile保存文件(“save.txt”);
saveFile.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(保存文件(&S);
出局();
保存->退出();
}
//槽
void主窗口::animateSave(未签名的短可见性){
QString visible=QString::number(可见性);
ui->Lbl\U已保存->设置样式表(“颜色:rgb(0255255,“+可见+”);”;
}
有人知道这里发生了什么吗

这是预期的。接收器
主窗口
位于另一个线程中。由于默认连接为,Qt将使用
队列连接
,并在与
主窗口
对象相同的线程中运行插槽
动画保存

但是,您根本不应该使用
QThread
。您不希望同时执行某些操作,而是希望在给定时间(或之后)发生某些事情。这就是您想要的

MainWindow::MainWindow(QWidget *parent)
{
    /* ... */
    myTimer = new QTimer(this);
    connect(myTimer, SIGNAL(timeout(), this, SLOT(decreaseAlphaOrStop()));
}

void MainWindow::on_Btn_Save_clicked(){
    /* .. snip .. */
    alpha = 250;
    myTimer->start(250);    
}

// new slot
void MainWindow::decreaseAlphaOrStop(){
    alpha -= 50;
    if( alpha < 0){
        alpha = 0;
        myTimer->stop();
    }
    animateSave(alpha);
}
MainWindow::MainWindow(QWidget*父项)
{
/* ... */
myTimer=新的QTimer(此);
连接(myTimer,信号(timeout(),this,SLOT(decreatesAlphaorStop()));
}
void main window::在单击时保存(){
/*…剪断*/
α=250;
myTimer->start(250);
}
//新槽
void主窗口::减少AlphaorStop(){
α-=50;
如果(α<0){
α=0;
myTimer->stop();
}
animateSave(alpha);
}
有人知道这里发生了什么吗

这是预期的。接收器
主窗口
位于另一个线程中。由于默认连接为,Qt将使用
队列连接
,并在与
主窗口
对象相同的线程中运行插槽
动画保存

但是,您根本不应该使用
QThread
。您不希望同时执行某些操作,而是希望在给定时间(或之后)发生某些事情。这就是您想要的

MainWindow::MainWindow(QWidget *parent)
{
    /* ... */
    myTimer = new QTimer(this);
    connect(myTimer, SIGNAL(timeout(), this, SLOT(decreaseAlphaOrStop()));
}

void MainWindow::on_Btn_Save_clicked(){
    /* .. snip .. */
    alpha = 250;
    myTimer->start(250);    
}

// new slot
void MainWindow::decreaseAlphaOrStop(){
    alpha -= 50;
    if( alpha < 0){
        alpha = 0;
        myTimer->stop();
    }
    animateSave(alpha);
}
MainWindow::MainWindow(QWidget*父项)
{
/* ... */
myTimer=新的QTimer(此);
连接(myTimer,信号(timeout(),this,SLOT(decreatesAlphaorStop()));
}
void main window::在单击时保存(){
/*…剪断*/
α=250;
myTimer->start(250);
}
//新槽
void主窗口::减少AlphaorStop(){
α-=50;
如果(α<0){
α=0;
myTimer->stop();
}
animateSave(alpha);
}

您还可以查找
QPropertyImation
的文档,并将其挂接到
QWidget::windowOpacity
上。这可能是最适合您的问题的方法

例如:

void MyWidget::buttonClicked() // SLOT when button is clicked
{
    QPropertyAnimation* anim = new QPropertyAnimation(ui->Lbl_Saved, "windowOpacity"); // new animation, hooked on the labels window opacity
    anim->setDuration(2500); // use 2.5 seconds for disapearing
    anim->setStartValue(1.0f); // from full visible
    anim->setEndValue(0.0f); // to invisible
    connect(anim, SIGNAL(finished()), anim, SLOT(deleteLater())); // delete object when animation done
    anim->start();
}

您还可以查找
QPropertyImation
的文档,并将其挂接到
QWidget::windowOpacity
上。这可能是解决您的问题最合适的方法

例如:

void MyWidget::buttonClicked() // SLOT when button is clicked
{
    QPropertyAnimation* anim = new QPropertyAnimation(ui->Lbl_Saved, "windowOpacity"); // new animation, hooked on the labels window opacity
    anim->setDuration(2500); // use 2.5 seconds for disapearing
    anim->setStartValue(1.0f); // from full visible
    anim->setEndValue(0.0f); // to invisible
    connect(anim, SIGNAL(finished()), anim, SLOT(deleteLater())); // delete object when animation done
    anim->start();
}

您犯了严重错误并将运行可见性更改为公共。您应该使用QThread::start来运行线程。切勿直接调用run。您犯了严重错误并将运行可见性更改为公共。您应该使用QThread::start来运行线程。切勿直接调用run
MainWindow::MainWindow(QWidget *parent)
{
    /* ... */
    myTimer = new QTimer(this);
    connect(myTimer, SIGNAL(timeout(), this, SLOT(decreaseAlphaOrStop()));
}

void MainWindow::on_Btn_Save_clicked(){
    /* .. snip .. */
    alpha = 250;
    myTimer->start(250);    
}

// new slot
void MainWindow::decreaseAlphaOrStop(){
    alpha -= 50;
    if( alpha < 0){
        alpha = 0;
        myTimer->stop();
    }
    animateSave(alpha);
}
void MyWidget::buttonClicked() // SLOT when button is clicked
{
    QPropertyAnimation* anim = new QPropertyAnimation(ui->Lbl_Saved, "windowOpacity"); // new animation, hooked on the labels window opacity
    anim->setDuration(2500); // use 2.5 seconds for disapearing
    anim->setStartValue(1.0f); // from full visible
    anim->setEndValue(0.0f); // to invisible
    connect(anim, SIGNAL(finished()), anim, SLOT(deleteLater())); // delete object when animation done
    anim->start();
}