[wxwidgets] Event-Problem! Macht wxTimer etwas Threads?
-
Hallo,
ich habe ein Programm, dass sich mit einem Server (ähnlich SOAP-Protokoll) unterhält.
Dazu habe ich keine Klasse mit etwas diesem Aufbau:AntwortType ClientForTalk::CreateMessage(wxString Befehl) { // Erstelle Anfrage als Text ... // Sende Daten per wxSocketClient ... // Warte auf Antwort (Warteschleife) while (Maximal15Sekunden || Buffervoll) { wxYieldIfNeeded(); } // Verarbeiten if (Buffervoll) return VerarbeiteAntwort(); throw FehlerMehrAls15Sekunden; } void ClientForTalk::OnSocketEvent(wxSocketEvent& event) { if (event.GetSocketEvent()==wxSOCKET_INPUT) { AddDataToBuffer(); CheckIfBufferVoll(); } }
So, dass klappt super. Wenn ich 25 Befehle ausführe, dann wird alles bestens gemacht. Jetzt zum Problem.
Der Server mit dem ich rede, der gibt ein Ticket mit einer Livetime raus. Die ist leider relativ kurz (meist 15 Sekunden). Wenn man sich nun länger nicht beim Server melden, dann muss man den Befehl IamAlive senden, sonst wird das Ticket geschlossen.
Da ich eine große Datei abarbeite und dabei viele externe Bildfunktionen und Datenbankaufrufe habe, kann ich schon mal über die 15 Sekunden drüber kommen. Also habe ich nun einen Timer eingehängt.
void MeineArbeitsApp::Arbeite() { // Anmelden ClientForTalk->Login(_T("user"),_T("pwd")); // Verarbeitung beginnen while (Datenda) { // Timer starten ClientForTalk->TimerStart(); // Verarbeite Daten; Pro Datei ca. 1-2 Minuten ... // Timer stoppen ClientForTalk->TimerStop(); // Ablegen der Daten ClientForTalk->SendData(); } ClientForTalk->Logout(); } void ClientForTalk::OnTimer(wxTimerEvent&) { try { CreateMessage(_T("IamAlive")); } catch(FehlerMehrAls15Sekunden) { wxLogError(_T("Geht nicht")); } }
Ich habe mir die Unterhaltung mit SmartSniff angesehen und sehe, dass im OnTimer der Befehl ordentlich gesendet wird und der Server auch ordentlich antwortet und mir sagt, dass meine Lifetime verlängert wird. Allerdings bekomme ich in meiner ClientForTalk:OnTimer immer den FehlerMehrAls15Sekunden - obwohl die Antwort keine 100 Millisekunden braucht.
Mit dem Debuger habe ich festgestellt, dass sich der Buffer nicht füllt. Erst wenn der Timer gestoppt wird und ClientForTalk->SendData() einen Befehl abschickt, kommen die Daten aus meinen Alive-Befehlen im Buffer an.
Mein Verdacht ist jetzt, dass wxTimer einen Thread startet und wxYield() aber die Event "nur" von dem Thread abarbeitet, nicht aber die Events vom HauptThread (wo MeineArbeitsApp liegt). Ich habe schon versucht das mit wxTheApp->Yield() zu lösen, aber irgendwie kommen innderhalb von ClientForTalk:OnTimer keine Events an ClientForTalk::OnSocketEvent an.
Kann ich noch irgendeine wxThread oder wxApp-Funktion ausführen, damit wirklich jeder Thread an der Stelle meiner Warteschleife bekommt?
Danke,
Stefan