Win CE Event in Qt-Eventqueue einreihen

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

Win CE Event in Qt-Eventqueue einreihen

Beitrag 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!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Win CE Event in Qt-Eventqueue einreihen

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

Re: Win CE Event in Qt-Eventqueue einreihen

Beitrag von Error1 »

Nein,
die Qt-DLL's sind ein Release - mein Binary - Debug.
Ich nutze die QextSerialPort nicht!
Error1
Beiträge: 8
Registriert: 25. Februar 2011 07:34

Re: Win CE Event in Qt-Eventqueue einreihen

Beitrag von Error1 »

Gelöst das Problem lag bereits bei der Programminstanzierung.
kuzulis
Beiträge: 25
Registriert: 30. September 2009 14:55
Wohnort: Russland, Brjansk
Kontaktdaten:

Re: Win CE Event in Qt-Eventqueue einreihen

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

Re: Win CE Event in Qt-Eventqueue einreihen

Beitrag 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!
kuzulis
Beiträge: 25
Registriert: 30. September 2009 14:55
Wohnort: Russland, Brjansk
Kontaktdaten:

Re: Win CE Event in Qt-Eventqueue einreihen

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

Re: Win CE Event in Qt-Eventqueue einreihen

Beitrag 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.
kuzulis
Beiträge: 25
Registriert: 30. September 2009 14:55
Wohnort: Russland, Brjansk
Kontaktdaten:

Re: Win CE Event in Qt-Eventqueue einreihen

Beitrag 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. :)
Antworten