Signal aus Threads senden
Verfasst: 11. August 2011 10:18
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!
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!