Hallo,
ich muss Signale von einem Windows Ce Dienst empfangen.
Da es mit den Qt Funktionen nicht geht, weil auch nicht mehr öffentlich, habe ich eine Threadklasse geschrieben die
nur auf auf zwei Signale wartet und mit der WIN32 Api arbeitet , was auch funktioniert.
Anbei Auszüge aus einem vereinfachten Bespielcode, es geht nur um das connecten:
void CeEventThr::run()
{ // Virtuelle Funktion als Vorlage zum Überschreiben
DWORD dwEvent = WAIT_OBJECT_0;
quint32 uinumb = tthrhandles.size();
HANDLE *phandle = tthrhandles.data();
emit sigGotCeEvent();
Q_ASSERT_X(uinumb != 0,"CeEventThr::run()","No Handles to wait for!");
while (bStop == false)
{
dwEvent = WaitForMultipleObjects(uinumb,phandle,FALSE,INFINITE);
emit sigGotCeEvent();
}
}
Leider schaffe ich aber nicht das Signal zu connecten!Connect lifert immer false zurück und
es gibt eine Debugmeldung, dass das signal nicht gefunden wurde.
ThreadKlasseSignals::ThreadKlasseSignals(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
p = new CeEventThr();
bool work = connect(p,SIGNAL(sigGotCeEvent()),this,SLOT(test()));
p->run();
}
Die Threadklasse:
#ifndef CEEVENTTHR_H
#define CEEVENTTHR_H
#include <qvector.h>
#include "qthread.h"
#include <Windows.h>
typedef QVector<HANDLE>t_handles;
class CeEventThr : public QThread
{
Q_OBJECT
public:
CeEventThr();
~CeEventThr();
inline void stopThr(bool& stop){bStop = stop;}
inline void setHandles(t_handles& rhandles){tthrhandles = rhandles;}
virtual void run();
signals:
void sigGotCeEvent();
private:
volatile bool bStop;
t_handles tthrhandles;
};
#include "ceeventthr.h"
CeEventThr::CeEventThr()
{
bStop = false;
}
CeEventThr::~CeEventThr()
{
}
void CeEventThr::run()
{ // Virtuelle Funktion als Vorlage zum Überschreiben
DWORD dwEvent = WAIT_OBJECT_0;
quint32 uinumb = tthrhandles.size();
HANDLE *phandle = tthrhandles.data();
emit sigGotCeEvent();
Q_ASSERT_X(uinumb != 0,"CeEventThr::run()","No Handles to wait for!");
while (bStop == false)
{
dwEvent = WaitForMultipleObjects(uinumb,phandle,FALSE,INFINITE);
emit sigGotCeEvent();
}
}
Danke im Voraus!
Signal aus Threads senden
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Signal aus Threads senden
1. Bitte die [
Code: Alles auswählen
] - Tags benutzen sonst kann man nichts erkennen
2. Wo und wie ist der test() - Slot deklariert?MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Signal aus Threads senden
Hallo Christian,
so jetzt alles vollständig.
so jetzt alles vollständig.
Code: Alles auswählen
#include "threadklassesignals.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ThreadKlasseSignals w;
w.show();
return a.exec();
}
Code: Alles auswählen
#ifndef CEEVENTTHR_H
#define CEEVENTTHR_H
#include <qvector.h>
#include "qthread.h"
#include <Windows.h>
typedef QVector<HANDLE>t_handles;
class CeEventThr : public QThread
{
Q_OBJECT
public:
CeEventThr();
~CeEventThr();
inline void stopThr(bool& stop){bStop = stop;}
inline void setHandles(t_handles& rhandles){tthrhandles = rhandles;}
virtual void run();
signals:
void sigGotCeEvent(int test);
private:
volatile bool bStop;
t_handles tthrhandles;
};
#endif // CEEVENTTHR_H
Code: Alles auswählen
#include "ceeventthr.h"
CeEventThr::CeEventThr()
:QThread()
{
bStop = false;
}
CeEventThr::~CeEventThr()
{
}
void CeEventThr::run()
{ // Virtuelle Funktion als Vorlage zum Überschreiben
DWORD dwEvent = WAIT_OBJECT_0;
quint32 uinumb = tthrhandles.size();
HANDLE *phandle = tthrhandles.data();
emit sigGotCeEvent(dwEvent);
Q_ASSERT_X(uinumb != 0,"CeEventThr::run()","No Handles to wait for!");
while (bStop == false)
{
dwEvent = WaitForMultipleObjects(uinumb,phandle,FALSE,INFINITE);
emit sigGotCeEvent(dwEvent);
}
}
Code: Alles auswählen
#ifndef THREADKLASSESIGNALS_H
#define THREADKLASSESIGNALS_H
#include "ceeventthr.h"
#include <QtGui/QMainWindow>
#include "windows.h"
#include "ui_threadklassesignals.h"
class ThreadKlasseSignals : public QMainWindow
{
Q_OBJECT
public:
ThreadKlasseSignals(QWidget *parent = 0, Qt::WFlags flags = 0);
~ThreadKlasseSignals();
private:
Ui::ThreadKlasseSignalsClass ui;
CeEventThr p;
public slots:
void test(int test);
};
#endif // THREADKLASSESIGNALS_H
Code: Alles auswählen
#include "threadklassesignals.h"
ThreadKlasseSignals::ThreadKlasseSignals(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
bool work = connect(&p,SIGNAL(sigGotCeEvent(int test)),this,SLOT(test(int test)));
p.run();
}
ThreadKlasseSignals::~ThreadKlasseSignals()
{
}
void ThreadKlasseSignals::test(int test)
{
}-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Signal aus Threads senden
Doku zu Signals/Slots lesen bitte - die Signaturen sind nicht korrekt. Variablennamen dürfen nicht mit rein.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Signal aus Threads senden
Ahhh natürlich, danke!Ich sehe den Wald vor Bäumen schon nicht mehr. 