ich bin gerade dabei einen Midiplayer zu programmieren und komme leider nicht mehr weiter.
In meinem Player gibt es zwei Threads, der Hauptthread und ein Thread der für das Abspielen der Midi-Befehle zuständig ist. Die Threads sollen über Signal/Slot verbindungen kommunizieren. Allerdings wird ein Slot einfach nicht ausgelöst, habe schon mehrere Sachen versucht, aber es nützt nichts. Ich hoffe hier kann mir jemand weiter helfen. Aber erstmal die wichtigen Codestellen dazu:
Header des Midiplayers
Code: Alles auswählen
class MidiPlayer : public QWidget
{
Q_OBJECT
public:
MidiPlayer(QWidget *parent = 0, Qt::WFlags flags = 0);
~MidiPlayer();
private:
Ui::MidiPlayerClass ui;
Reader m_reader;
QStatusBar m_bar;
Song m_song;
MidiOutCycle m_cycle;
QThread m_cyleThrd;
public slots:
void loadFile();
signals:
void addTrack(TrackOnDevice track);
};Code: Alles auswählen
MidiPlayer::MidiPlayer(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
QObject::connect(ui.b_laden, SIGNAL(clicked()), this, SLOT(loadFile()));
QObject::connect(ui.b_play, SIGNAL(clicked()), &m_cycle, SLOT(play()));
QObject::connect(ui.b_pause, SIGNAL(clicked()), &m_cycle, SLOT(pause()));
QObject::connect(ui.b_stopp, SIGNAL(clicked()), &m_cycle, SLOT(stop()));
QObject::connect(this, SIGNAL(addTrack(TrackOnDevice)), &m_cycle, SLOT(addTrack(TrackOnDevice))); //dieser Slot Funktioniert nicht!
//QObject::connect(this, SIGNAL(addTrack(TrackOnDevice)), qApp, SLOT(aboutQt())); //das hier funktioniert aber
m_cycle.moveToThread( &m_cyleThrd);
m_cyleThrd.start();
ui.verticalLayout_2->addWidget( &m_bar);
m_bar.showMessage(tr("Bereit"), 3000);
}Code: Alles auswählen
class MidiOutCycle : public QObject
{
Q_OBJECT
typedef std::multimap<unsigned int, Track*> Ch2TrckMap; // Liste nach Channeln die die Tracks enthält.
private:
/* ... */
public:
MidiOutCycle();
public slots:
void play();
void pause();
void stop();
void setBPM(unsigned int bpm);
void setRes(DWORD res);
void addTrack(TrackOnDevice track);
void removeTrack(Track *track, unsigned int device);
void cycle();
signals:
void finished();
void tick();
};Code: Alles auswählen
void MidiOutCycle::addTrack(TrackOnDevice track)
{
m_tracks.insert(track);
}Code: Alles auswählen
typedef std::pair< unsigned int, Track*> TrackOnDevice;http://samdutton.wordpress.com/2008/10/ ... ots-in-qt/
Da ich hier wirklich am ende meines Lateins bin, wäre ich wirklich froh, wenn mir jemand sagen könnte wo der Fehler den liegt. Eine Alternativlösung für das Problem wäre natürlich auch super =)