Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2014, 09:42   #1
mr_virtus
 
Регистрация: 10.03.2014
Сообщений: 4
По умолчанию Программа, отрисовывающая точки тремя потоками

Всем привет!

Помогите, пожалуйста, разобраться в написании программы, в которой должны быть три потока и эти потоки рисуют свои точки.

Должны в итоги получится 3 прерывистые линии, каждая идущая на своем уровне:

Вот что я сделал:

В хедере:

класс главного окна:

Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <windows.h>
#include <QPainter>
#include <QColor>

namespace Ui {
class MainWindow;
}

class MyPoint;
class MyData;

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //bool res = SetProcessAffinityMask(GetCurrentProcess(), 1);
    void paintVector();
    static DWORD WINAPI ThreadFunction(LPVOID lpParam);
protected:
    void virtual paintEvent(QPaintEvent*);

private:
    Ui::MainWindow *ui;
    static QVector<MyPoint> vPoints;
    static int currentX;

    HANDLE handles[3];
    static CRITICAL_SECTION* crSecPtr;

    static MyData* th1Ptr;
    static MyData* th2Ptr;
    static MyData* th3Ptr;
private slots:
    void RepaintSlot();
    void on_NoSync_clicked();
};
создал вспомагательный класс для точки и данных, которые будут передаваться в потоковую функцию:

Код:
class MyPoint {
    QColor m_col;
    QPoint m_pt;
public:
    MyPoint(const QPoint& pt = QPoint(), QColor col = QColor(Qt::red));
    void paint(QPainter& pe);
    ~MyPoint(){}

friend class MainWindow;
};

class MyData : public QObject {
    Q_OBJECT
    int y;
    int maxX;
    QColor col;
    HANDLE hObject;
public:
    MyData(int, int, QColor, HANDLE);
    ~MyData(){}
    void SendNeedReDraw(MyPoint&);
signals:
    void needRedraw(MyPoint&);
};
А вот, что получилось написать в .срр:

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

QVector<MyPoint> MainWindow::vPoints;

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent* pe) {
    QPainter p(this);
    if (vPoints.isEmpty()) return;
    for (int i = 0; i < vPoints.size(); i++){
        vPoints[i].paint(p);
    }
}

DWORD WINAPI MainWindow::ThreadFunction(LPVOID myData){
      MyPoint newPoint(QPoint(currentX, myData->y), myData->col);
      vPoints.append(newPoint);
      myData->SendNeedReDraw(myData);
}

void MainWindow::RepaintSlot(){
    repaint();
}

MyPoint::MyPoint(const QPoint &pt, QColor col){
    m_pt = pt;
    m_col = col;
}

void MyPoint::paint(QPainter& p){
    QPen pen(m_col);
    pen.setWidth(5);
    p.setPen(pen);
    p.drawPoint(m_pt);
}

MyData::MyData(int y, int maxX, QColor col, HANDLE hObject){
    this->y = y;
    this->maxX = maxX;
    this->col = col;
    this->hObject = hObject;
}

void MyData::SendNeedReDraw(MyPoint& point){
    emit needRedraw(point);
}

void MainWindow::on_NoSync_clicked()
{
}
Я не знаю, что дальше ещё написать / исправить, что у меня запускались три потока и каждый рисовал свою линию на своем уровне и они рисовались попеременно.

Буду очень благодарен, если кто подскажет.

Спасибо.
mr_virtus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа с тремя уравнениями zanuudaa Помощь студентам 4 15.12.2013 09:50
программа с потоками KlIm16 Общие вопросы C/C++ 0 05.03.2013 20:41
Программа определения принадлежности точки заштрихованной области Al'f!ra Паскаль, Turbo Pascal, PascalABC.NET 9 16.02.2012 23:07
Попадание точки в заштрихованную область (программа на условие), C++ 3.1 #Nii Помощь студентам 2 16.10.2008 20:22
Найти координаты хотя бы одной точки, попадающей в область, образованную тремя пересекающимися линиями. Zibiv Помощь студентам 1 03.10.2008 17:55