• 5295阅读
  • 5回复

线程中的奇怪问题 [复制链接]

上一主题 下一主题
离线zhuxun37
 
只看楼主 倒序阅读 楼主  发表于: 2008-08-03
— 本帖被 XChinux 执行加亮操作(2008-08-06) —
线程初始化时,在构造函数中调用 this->paintFirst(); 绘画是成功的,但是同样的程序放到 run(); 中确什么也没有画出来,是什么问题啊?

thread.h 如下:
  1. #ifndef THREAD_H
  2. #define THREAD_H
  3. #include <QThread.h>
  4. class QLabel;
  5. class QPixmap;
  6. class MyThread : public QThread {
  7.   Q_OBJECT
  8.   public:
  9.     MyThread(QLabel *label, QPixmap *pixmap, int y);
  10.   protected:
  11.     void run();
  12.     void paintFirst();
  13.   private:
  14.     QLabel *label;
  15.     QPixmap *pixmap;
  16.     int y;
  17. };
  18. #endif


thread.cpp 如下:
  1. #include "thread.h"
  2. #include <QLabel.h>
  3. #include <QPainter.h>
  4. #include <QPixmap.h>
  5. MyThread::MyThread(QLabel *label, QPixmap *pixmap, int y) {
  6.   this->label = label;
  7.   this->pixmap = pixmap;
  8.   this->y = y;
  9.   //this->paintFirst();
  10. }
  11. void MyThread::paintFirst() {
  12.   QPainter paint(pixmap);
  13.   paint.setPen(Qt::DotLine);
  14.   paint.drawEllipse(50, 50, 30, 30);
  15.   label->setPixmap(*pixmap);
  16. }
  17. void MyThread::run() {
  18.   QPainter paint(pixmap);
  19.   paint.setPen(Qt::DotLine);
  20.   paint.drawEllipse(50, 50, 30, 30);
  21.   label->setPixmap(*pixmap);
  22. }


main.cpp 如下:
  1. #include <QApplication.h>
  2. #include <QMainWindow.h>
  3. #include <QPainter.h>
  4. #include <QPixmap.h>
  5. #include <QLabel.h>
  6. #include "thread.h"
  7. class MainThread : public QMainWindow {
  8.   public:
  9.     MainThread();
  10.     QLabel *label;
  11.     QPixmap *pixmap;
  12.     MyThread *threadF;
  13. };
  14. MainThread::MainThread() {
  15.   this->setWindowTitle("Thread Demo");
  16.   this->setGeometry(100, 100, 320, 200);
  17.  
  18.   label = new QLabel(this);
  19.   label->setGeometry(0, 0, 320, 200);
  20.   label->setAlignment(Qt::AlignTop);
  21.   label->setText("Begin...");
  22.  
  23.   pixmap = new QPixmap(320, 200);
  24.   pixmap->fill(Qt::red);
  25.  
  26.   threadF = new MyThread(label, pixmap, 100);
  27.   threadF->start();
  28. }
  29. int main(int argc, char **argv) {
  30.   QApplication a(argc, argv);
  31.   MainThread m;
  32.   m.show();
  33.   return a.exec();
  34. }
离线zhuxun37
只看该作者 1楼 发表于: 2008-08-05
有知道的教教我啊,我想应该不会是配置的问题吧
离线water_wf

只看该作者 2楼 发表于: 2008-08-05
线程中最好不要操作gui界面,通过postevent发消息出来
离线zhuxun37
只看该作者 3楼 发表于: 2008-08-05
好,谢谢楼上的,不过还是想知道为什么
离线water_wf

只看该作者 4楼 发表于: 2008-08-06
你的设计线程运行完就推出了,同样会引起主线程的repaint操作,所以实际上什么也没做
离线uyoufaith

只看该作者 5楼 发表于: 2008-08-07
void MyThread::run()
{
  QPainter paint(pixmap);
  paint.setPen(Qt::DotLine);
  paint.drawEllipse(50, 50, 30, 30);
  label->setPixmap(*pixmap);
}

是不是只执行了一次,执行完毕后就完毕了,资源也释放了。。。

你在里面弄个死循环试下

void MyThread::run() {

while(1)
{
  QPainter paint(pixmap);
  paint.setPen(Qt::DotLine);
  paint.drawEllipse(50, 50, 30, 30);
  label->setPixmap(*pixmap);
}


}
快速回复
限100 字节
 
上一个 下一个