Witam wszystkich,
Napotkałem problem, przy próbie napisania aplikacji na wątkach.
Aplikacja ta ma rysować linię przy pomocy biblioteki QGraphicsItem.
Konkretnie chodzi o to, że mam narysowaną czarną linie, po naciśnięciu przycisku po tej czarnej linii ma się przesuwać czerwony prostokąt (to już mam gotowe).
Docelowo chcę zrobić, aby można było wypuścić po naciśnięciu innego przycisku (lub drugi raz tego sameg) kolejny prostokąt, tak aby w przypadku gdy pierwszy jeszcze jest "na trasie" obydwa poruszały się jednocześnie.
Uruchamiam jeden wątek z jednego przycisku - leci prostokąt
Jednak gdy nacisnę drugi przycisk i wypuszczę drugi prostokąt, ten pierwszy się zatrzymuje, dopiero w momencie gdy drugi doleci do końca, ten pierwszy znowu rusza.
Czy istnieje jakiś sposób, aby te dwa wątki pracowały współbieżnie?
Chyba, że robie coś źle i wychodzi na to że to jest jeden wątek.
Proszę o jakieś wskazówki i wyrozumiałość.
Kod wygląda mniej więcej tak
Klasa wątku:
#include <QThread>
class myThread : public QThread
{
Q_OBJECT
public:
explicit myThread(QObject *parent = 0);
void run();
signals:
void go(int);
};
Klasa mainwindow:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
myThread *mThread, *mThread2;
private:
Ui::MainWindow *ui;
// QGraphics ....
public slots:
void on_go(int);
void on_go2(int);
private slots:
void on_btnAdd1_clicked();
void on_btnAdd2_clicked();
};
Definicja metody run():
void myThread::run()
{
emit go(1);
// 1 w parametrze dla tego, że wyswietlalo mi warningi wiec dodalem do metod parametry
}
Definicja on_go() (analogiczna jest on_go2):
void MainWindow::on_go(int watek)
{
Draw(); //funkcja rysująca czerwony prostokąt
}
Zdarzenie po wcisnieciu przycisku (analogicznie wyglada drugi przycisk):
void MainWindow::on_btnAdd1_clicked()
{
mThread -> start();
}
I connecty (oczywiście w konstruktore mainwindow:
mThread = new myThread(this);
connect(mThread,SIGNAL(go(int)),this,SLOT(on_go(int)));
mThread2 = new myThread(this);
connect(mThread2,SIGNAL(go(int)),this,SLOT(on_go2(int)));
Wydaje mi się, że problemem jest to, że emit na go() wywołuje tylko raz, a nie w pętli (bo w pętli rysuje te prostokąty, które się poruszają po czarnejlinii). Jednak w run() nie mogę dać tej pętli, ponieważ pętla leci do pewnej wartości, która jest pobierana ze spinboxa, a w run() nie mam dostępu do obiektów ui.