• 25657阅读
  • 41回复

【求助】qt-embedded-2.3.7如何实现多线程绘图 [复制链接]

上一主题 下一主题
离线dazzling
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-02
— 本帖被 XChinux 执行加亮操作(2008-11-30) —
写了一个界面,想开个线程单独在界面上绘图,想的是用postEvent()跟主界面通信,主界面中用customEvent()槽函数接受这个事件,事件类和线程类的run()函数以及事件接收槽函数如下:
class myEvent : public QCustomEvent
{
public:
    myEvent(int i) : QCustomEvent(12345), id(i) {};
    int id;
};


void ThreadA::run()
{
    for(int i = 0; i < 14; i++){
      myEvent *event = new myEvent(1);
      QThread::postEvent(receiver, event);
      sleep(1);
    }
}


void Draw::customEvent(myEvent *event)
{
    if(event->type() == 12345){
        static int a[26] = {60, 84, 50, 91, 84, 101, 95, 132, 114, 120, 85, 131, 116, 6, 121, 210, 207, 63, 65, 214, 216, 121, 92, 121, 154, 161};
        static int i = 0;
        pa->drawLine(a, a[i + 1], a[i + 2], a[i + 3]);    //主界面里定义的一个QPainter 指针
        i = i + 2;
    }
}

但是编译可以通过,运行起来却得不到想要的结果,线程貌似在执行,但是就是没有绘制曲线。。。。望各位大大们能指点一二,不胜感激
离线zuogenyu

只看该作者 1楼 发表于: 2008-11-04
我要是帮你整出来,版主给分么?
离线dazzling
只看该作者 2楼 发表于: 2008-11-04
我是新手,这才是偶的第一篇贴,不知道有没有LS要的分,有的话就都拿去吧!
离线zuogenyu

只看该作者 3楼 发表于: 2008-11-05
你把代码多贴点出来,最好是把你需要改的那部分整个提出来生成个完整的工程再发给我,我就可以帮你完成其他的了。你这样贴那么几个函数,我确实猜不出其他相关细节,也无从下手。
离线imho
只看该作者 4楼 发表于: 2008-11-05
上面这个程序基本上和多线程没什么关系
离线dazzling
只看该作者 5楼 发表于: 2008-11-05
嗯,好的,先谢谢zuogenyu了,之前只是怕贴出来太多了,看不清楚,所以就挑了几个觉得可能有问题的地方给贴出来了,完整的程序贴在了下面,目的主要是想在主界面上有两个按钮,点击其中一个打开一个线程可以在主界面绘制一条曲线,点击另一个也是同样的功能,但是他俩要可以同时运行,程序写的比较烂,希望不要见笑啊~~麻烦了
#ifndef TEST_H
#define TEST_H

#include <qdialog.h>
#include <qpainter.h>
#include <qstring.h>
#include <qthread.h>

class QPushButton;
class Draw;
class myEvent;

class ThreadA : public QThread
{
public:
    ThreadA(Draw* d) : receiver(d)
    { ; }
    void run();

private:
    Draw *receiver;
};

class ThreadB : public QThread
{
public:
  ThreadB(Draw* d) : receiver(d)
  { ; }
  void run();

private:
    Draw *receiver;
};

class Draw : public QDialog
{
    Q_OBJECT
public:
    Draw(QWidget* parent = 0, const char* name = 0);

private:   
    QPushButton* buttonA;
    QPushButton* buttonB;
    QPushButton* button1;
    QPainter *pa;
    QPainter *pb;
    ThreadA threadA;
    ThreadB threadB;
   
protected:   
    void customEvent(myEvent *);

public slots:
    void drawGrid();
    void startA();
    void startB();
   
protected slots:
    void languageChange();
};
#endif //TEST_H


#include "test.h"

#include <qdialog.h>
#include <qthread.h>
#include <qpushbutton.h>
#include <qpainter.h>
#include <qrect.h>
#include <qmessagebox.h>

class myEvent : public QCustomEvent
{
public:
    myEvent(int i) : QCustomEvent(12345), id(i) {};
    int id;
};

void ThreadA::run()
{
    for(int i = 0; i < 14; i++){
      myEvent *event = new myEvent(1);
      QThread::postEvent(receiver, event);
      sleep(1);
    }
}

void ThreadB::run()
{
  for(int i = 0; i < 14; i++){
      myEvent *event = new myEvent(2);
      QThread::postEvent(receiver, event);
      sleep(1);
    }
    //QMessageBox::information(this, "Thread is running");
}

Draw :: Draw(QWidget* parent, const char* name) : QDialog(parent, name), threadA(this), threadB(this)
{
    if (!name)
      setName("draw");
    QPalette pal;
    QColorGroup cg;
    cg.setColor( QColorGroup::Background, QColor( 154, 230, 230) );
    cg.setColor( QColorGroup::Button, QColor( 192, 192, 192) );
    cg.setColor( QColorGroup::ButtonText, black );
    pal.setActive( cg );
    setPalette( pal );

    buttonA = new QPushButton(this, "buttonA");
    buttonA->setGeometry(5, 5, 80, 30);

    buttonB = new QPushButton(this, "buttonB");
    buttonB->setGeometry(5, 40, 80, 30);

    button1 = new QPushButton(this, "button1");
    button1->setGeometry(90, 5, 80, 30);

    pa = new QPainter(this);
    pa->setPen(red);
    pb = new QPainter(this);
    pb->setPen(yellow);

    connect(buttonA, SIGNAL(clicked()), this, SLOT(startA()));
    connect(buttonB, SIGNAL(clicked()), this, SLOT(startB()));
    connect(button1, SIGNAL(clicked()), this, SLOT(drawGrid()));
    languageChange();
    resize(QSize(240, 320));
}

void Draw::drawGrid()
{
    QPainter* painter = new QPainter(this);
    QRect rect(10, 40, 200, 230);
   
    for (int i = 0; i <= 5; i++){
      int x = rect.left() + (i * (rect.width() - 1) / 5);
      double label = 15 * i;
      painter->setPen(black);
      painter->drawLine(x, rect.top(), x, rect.bottom());
      painter->drawLine(x, rect.bottom(), x, rect.bottom() + 5);
      painter->setPen(yellow);
      painter->drawText(x - 10, rect.bottom() + 5, 20, 20, AlignHCenter | AlignTop, QString::number(label));
  }
    painter->setPen(black);   
    painter->drawRect(rect);
}

void Draw::startA()
{
    threadA.start();
    //threadA.wait();
}

void Draw::startB()
{
    threadB.start();
    //threadB.wait();
}

void Draw::customEvent(myEvent *event)
{
    if(event->type() == 12345){
        //pa->drawLine(25,25,100,100);   
    switch(event->id){
    case 1:
    {
        static int a[26] = {60, 84, 50, 91, 84, 101, 95, 132, 114, 120, 85, 131, 116, 6, 121, 210, 207, 63, 65, 214, 216, 121, 92, 121, 154, 161};
        static int i = 0;
        pa->drawLine(a, a[i + 1], a[i + 2], a[i + 3]);
        i = i + 2;
        break;
    }
    case 2:
    {
        static int b[26] = {63, 207, 92, 121, 65, 214, 216, 121, 60, 121, 210, 154, 84, 50, 91, 84, 101, 95, 132, 114, 120, 85, 131, 116, 6, 161};
        static int j = 0;
        pb->drawLine(b[j], b[j + 1], b[j + 2], b[j + 3]);
        j = j + 2;
        break;
    }
    default: break;
    }
    }
}

void Draw::languageChange()
{
    setCaption("It's a test");
    buttonA->setText(tr("startA"));
    buttonB->setText(tr("startB"));
    button1->setText(tr("axis"));
}
离线zuogenyu

只看该作者 6楼 发表于: 2008-11-06
帮你改正确了,threadA和threadB可以同时画曲线。我把代码发给你,自己下了看吧。
还有,我已经上2440开发板跑了,运行正常。

源代码:threadTest.rar
离线dazzling
只看该作者 7楼 发表于: 2008-11-06
zuogenyu真是好人 建议版主考虑加分,太感谢了!这个问题困扰了我好久,意思好像是customEvent()只能接受QCustomEvent类型的事件,想向zuogenyu大大学习qt,不知可否加你的QQ 我的QQ号:443762459
离线zuogenyu

只看该作者 8楼 发表于: 2008-11-06
我这里有个群:30195782
里面大部分都是上班族,以QT为开发工具。你有兴趣可以加进来一起交流。
我个人QQ就不方便留了。不好意思!
离线dazzling
只看该作者 9楼 发表于: 2008-11-10
呵呵,没关系,还是非常谢谢你 ,我试试看能不能加入群里吧~
离线x-planet

只看该作者 10楼 发表于: 2008-11-10
我也想参考一下 但是威望不够啊
离线guojianfei
只看该作者 11楼 发表于: 2008-11-19
thank
离线guojianfei
只看该作者 12楼 发表于: 2008-11-19
thank
离线lcl987512
只看该作者 13楼 发表于: 2009-01-04
不错学习了
离线xiaoxixi
只看该作者 14楼 发表于: 2009-01-12
下载不了?
离线xiaoxixi
只看该作者 15楼 发表于: 2009-01-12
不错,学习了
离线xiaoxixi
只看该作者 16楼 发表于: 2009-01-12
thks
离线jzj139
只看该作者 17楼 发表于: 2009-01-22
顶-缺字补全
qt
离线thinker1981
只看该作者 18楼 发表于: 2009-02-03
我也想看看
离线thinker1981
只看该作者 19楼 发表于: 2009-02-03
学习
离线thinker1981
只看该作者 20楼 发表于: 2009-02-03
在学习 威望不够 大家见谅
离线zhaodongxu
只看该作者 21楼 发表于: 2009-02-05
这是一个好问题
离线z000356
只看该作者 22楼 发表于: 2009-03-13
谢谢
离线nancy
只看该作者 23楼 发表于: 2009-03-15
学习了
离线xiner81215
只看该作者 24楼 发表于: 2009-03-30
谢谢
离线xiewen202
只看该作者 25楼 发表于: 2009-04-23
真不错 我也参考参考
离线wise91575
只看该作者 26楼 发表于: 2009-04-24
good
离线wise91575
只看该作者 27楼 发表于: 2009-04-24
PC下原理应该也是一样的
离线wise91575
只看该作者 28楼 发表于: 2009-04-24
thanks
离线hanhanyong
只看该作者 29楼 发表于: 2009-04-26
问个很菜的问题啊,这个程序如何在QT4上运行啊!!QT4中无QCustomEvent啊!!
离线jervishappy

只看该作者 30楼 发表于: 2009-04-28
晕,威望还不够啊
离线jervishappy

只看该作者 31楼 发表于: 2009-04-28
为什么我运行的时候会提示以下错误啊?请帮忙解答,谢谢
In file included from main.cpp:14:
test.h:14: parse error before `{' token
test.h:26: parse error before `{' token
test.h:32: parse error before `public'
test.h:49: field `threadA' has incomplete type
test.h:50: field `threadB' has incomplete type
离线leonfeng
只看该作者 32楼 发表于: 2009-05-11
很好很强大~
离线ykeastronaut
只看该作者 33楼 发表于: 2009-09-03
学习了! 非常感谢,楼上的各位!
离线yang505982

只看该作者 34楼 发表于: 2009-09-05
呵呵,下来看看
离线www85522
只看该作者 35楼 发表于: 2010-06-13
谢谢楼主
离线jonestven

只看该作者 36楼 发表于: 2010-06-15
看看!学习学习!
离线2167young
只看该作者 37楼 发表于: 2010-06-19
正好需要到 多线程
离线burst

只看该作者 38楼 发表于: 2011-10-29
学习了,不错的帖子
离线frognidie

只看该作者 39楼 发表于: 2012-05-02
顶 谢谢了 学习下
快速回复
限100 字节
 
上一个 下一个