Seite 1 von 1

Win CE Event in Qt-Eventqueue einreihen

Verfasst: 9. August 2011 14:02
von Error1
Hallo,
ich bin noch realitiv in der Qt-Materie, habe aber schon das erste große Problem.

Ich schreibe eine Qt-Konsolenanwendung die Daten und Event seines WinCE-Dienst empfängt.

Der Dienst bedient die RS232 uns soll sich über ein Event melden, um die Nutzdaten abzuholen.

Leider habe ich beim Einbinden des Event ein Q_ASSERT Problem(Rot markiert):
00051 : QObject(parent), handleToEvent(hEvent), enabled(false)
00052 {
00053 Q_D(QObject);
00054 QEventDispatcherWin32 *eventDispatcher = qobject_cast<QEventDispatcherWin32 *>(d->threadData->eventDispatcher);
00055 Q_ASSERT_X(eventDispatcher, "QWinEventNotifier::QWinEventNotifier()",
00056 "Cannot create a win event notifier without a QEventDispatcherWin32");

00057 eventDispatcher->registerEventNotifier(this);
00058 enabled = true;
00059 }

Das Problem tritt auf wenn ich folgenden Code ausführe(rot markiert):

bool MST_Interface::init(void)
{

//Auf die Dienst-Nachrichten registrieren
herrevent = INVALID_HANDLE_VALUE;
hrecevent = INVALID_HANDLE_VALUE;
hmsgqueue = INVALID_HANDLE_VALUE;
//WINAPI Event erstellen und in der QtMsgqueue registrieren
hrecevent = CreateEvent(NULL,FALSE,FALSE,TEXT("RXMessageready"));
if(hrecevent == INVALID_HANDLE_VALUE)
{
qDebug()<< __FILE__ << "Unable to create receive event" ;
return false;
}
else
{//Event Receive in der Qt-Queue registrieren
notrecevent = new QWinEventNotifier(hrecevent,this);
connect(notrecevent, SIGNAL(activated(HANDLE)),SLOT(&serviceReceiveHandler(HANDLE h)));

}

Leider habe ich gar keine Idee was daran falsch sein könnte.

Da ich das nicht zum Spaß mache sondern unter Zeitdruck stehe bin ich für jede Hilfe sehr dankbar!

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 9. August 2011 14:35
von franzf
Die Fehlermeldung bei google eingeben, bringt einen Eintrag bei Stackoverflow zu Tage:
http://stackoverflow.com/questions/3511 ... tcherwin32
Trifft das bei dir auch zu?

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 9. August 2011 14:53
von Error1
Nein,
die Qt-DLL's sind ein Release - mein Binary - Debug.
Ich nutze die QextSerialPort nicht!

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 11. August 2011 09:38
von Error1
Gelöst das Problem lag bereits bei der Programminstanzierung.

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 11. August 2011 15:06
von kuzulis
Error1 hat geschrieben:Gelöst das Problem lag bereits bei der Programminstanzierung.
Erzähl mir mehr darüber, wie Sie das Problem gelöst?

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 16. August 2011 12:44
von Error1
Ganz einfach:

Auf eine Instanz von QObject zugegriffen vor dem Start von QCoreApplication a(argc, argv) in der main.

Ein dummer Copy&Paste Fehler!

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 16. August 2011 19:48
von kuzulis
Error1 hat geschrieben:Ganz einfach:

Auf eine Instanz von QObject zugegriffen vor dem Start von QCoreApplication a(argc, argv) in der main.

Ein dummer Copy&Paste Fehler!
Nein, ich meine es:
...
Ich schreibe eine Qt-Konsolenanwendung die Daten und Event seines WinCE-Dienst empfängt.

Der Dienst bedient die RS232 uns soll sich über ein Event melden, um die Nutzdaten abzuholen.
...
Wie du fangen Sie ein Ereignis aus dem seriellen Port for WinCE?
Du erstelle einen Thread mit einer Schleife:

Code: Alles auswählen

YuorThread::run
{
...
    while (...) {
        WaitCommEvent(..., ...);
    }
...
}
???
Und wenn ja, wie Sie aus exit WaitCommEvent ??
Kann ich exit aus WaitCommEvent, execute SetCommMask (for WinCE)?

Ich möchte hinzufügen (bereits hinzugefügt), um QSerialDevice Unterstützung WinCE und wollen wissen: ob ich es realisiert oder nicht.
See: https://gitorious.org/qserialdevice/qse ... 4f8835e04b

PS: Sorry my Deutsch

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 19. August 2011 09:06
von Error1
Hi kuzulis,

Ja, WaitCommEvent() wird in einem Thread aufgerufen.

Die serielle Kommunikation läuft in einem Service(Dienst) und wird in der Services.exe verwaltet.
Ich brauche hier nicht abzubrechen, da ich den Port immer belege.

In Qt warte ich dann mit WaitforMultiplyObjects() auf eigene Events aus diesem Dienst.

Ich habe mal kurz nahgeschaut und ich mache es mit SetCommMask();

Code: Alles auswählen

  //ReadThread beenden wenn gestartet 
  if(t_ReadThread.hthread != INVALID_HANDLE_VALUE)
    {
    t_ReadThread.bRun = FALSE;
    SetCommMask(hserial, 0);
    WaitForSingleObject(t_ReadThread.hthread,0);
    CloseHandle(t_ReadThread.hthread);

    }
Was passiert wenn du den Filedescriptor schließt? Kehrt WaitCommEvent() dann mit einem Fehler zurück? :idea:

Have also a look at:http://msdn.microsoft.com/de-de/library/ms681951 This should work for sure.

Re: Win CE Event in Qt-Eventqueue einreihen

Verfasst: 19. August 2011 11:08
von kuzulis

Code: Alles auswählen

Was passiert wenn du den Filedescriptor schließt? Kehrt WaitCommEvent() dann mit einem Fehler zurück?
Ich weiß nicht. Ich habe keine Geräte mit WinCE. Ich schrieb den Code "in die blind."
Und ich hatte nichts zu seiner Arbeit zu überprüfen.

PS:
Ich habe bereits die Antwort auf diese: call SetCommMask() unterbricht WaitCommEvent() - das ist genau das, was ich wissen musste.
dh Ich habe eine positive Antwort.

Vielen Dank für Ihre Teilnahme. :)