• 5055阅读
  • 7回复

启动子线程后 程序莫名停掉了,请教!!(已解决) [复制链接]

上一主题 下一主题
离线lyp40293
 

只看楼主 倒序阅读 楼主  发表于: 2010-05-10
编写的一个简单实验小程序,启动子线程后程序莫名停掉了,请教各位高手是怎么回事!(小弟做项目时间紧任务重,以前学的C,现学现卖C++和QT,很菜的地方还请牛人们包含指正)
想实现当点击start按钮时通过信号使主窗口testLabel变为绿色,代码如下:


/*--------- HEADER --------------*/
#include <QMainWindow>
#include <QThread>
namespace Ui
{
   class MainWindow;
}
class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
protected:
   void changeEvent(QEvent *e);
private:
   Ui::MainWindow *Ui;
   mythread *my;
public slots:
   void on_startButton_clicked();
   void on_quitButton_clicked();
   void colorchange();

};
class mythread : public QThread
{
   Q_OBJECT
public:
   mythread(QObject *parent);
   ~mythread();
   void run();
signals:
   void sig();
};
/* -----------   CPP     ------------ */
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent),ui(new Ui::MainWindow)
{
   ui->setupUi(this);
}
MainWindow::~MainWindow()
{
  delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
   ...............
   //代码自动生成
   ...............
}

int main(int argc,char *argv[])
{
     QApplication a(argc,argv);
     MainWindow w;
     w.show();
    retuin a.exec();
}

/*-------  以上代码为建立QT GUI工程自动创建  -------*/

void MainWindow::on_startButton_clicked()
{
   my->start();
}
void MainWindow::on_quitButton_clicked()
{
   close();
}
void MainWindow::colorchange()
{
   ui->testLabel->setStyleSheet("bakcground:green");
}
mythread::mythread(QObject *parent)
        : QThread(parent)
{
       connect(my,SIGNAL(sig()),MainWindow,SLOT(colorchange()));
}
mythread::~mythread()
{
}
void mythread::run()
{
   int i;
   while(TRUE)
  {
      for(i = 0;i < 1000;i++)
      {
         //do nothing 
       }
      emit sig();
  }
}









[ 此帖被lyp40293在2010-05-11 22:56重新编辑 ]
离线wato
只看该作者 1楼 发表于: 2010-05-11
你不停地发信号   相当于主线程也死循环了
离线paranoid
只看该作者 2楼 发表于: 2010-05-11
mythread *my,没有初始化
离线lyp40293

只看该作者 3楼 发表于: 2010-05-11
引用第1楼wato于2010-05-11 09:57发表的  :
你不停地发信号   相当于主线程也死循环了


主线程死循环应该窗口没反应才对,不应该直接跳出finish掉啊~
离线wato
只看该作者 4楼 发表于: 2010-05-11
LZ为什么无视2楼?
离线lyp40293

只看该作者 5楼 发表于: 2010-05-11
引用第4楼wato于2010-05-11 14:38发表的  :
LZ为什么无视2楼?

新的实验表明即使run()函数什么都不做,一start仍然finish掉
PS:版本是Qt4.6,creator2.0,Ubuntu10.4
离线paranoid
只看该作者 6楼 发表于: 2010-05-11
MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
my = new mythread(this);
}
离线lyp40293

只看该作者 7楼 发表于: 2010-05-11
LS正解!thx  a lot!!
快速回复
限100 字节
 
上一个 下一个