Signal aus Threads senden

Alles rund um die Programmierung mit Qt
Antworten
Error1
Beiträge: 8
Registriert: 25. Februar 2011 07:34

Signal aus Threads senden

Beitrag von Error1 »

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!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Signal aus Threads senden

Beitrag von Christian81 »

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
Error1
Beiträge: 8
Registriert: 25. Februar 2011 07:34

Re: Signal aus Threads senden

Beitrag von Error1 »

Hallo Christian,

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

Beitrag von Christian81 »

Doku zu Signals/Slots lesen bitte - die Signaturen sind nicht korrekt. Variablennamen dürfen nicht mit rein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Error1
Beiträge: 8
Registriert: 25. Februar 2011 07:34

Re: Signal aus Threads senden

Beitrag von Error1 »

Ahhh natürlich, danke!Ich sehe den Wald vor Bäumen schon nicht mehr. :idea:
Antworten