Ich hab ein Problem in einem meiner Linux - Programme.
Ich habe eine Funktion, die sekündlich zyklisch aufgerufen wird. Sie iteriert über eine STL-List.
Die Elemente der Liste sind structs vom Typ Message.
Jede Message hat einen Timestamp Now, in welchem der Linux-Timestamp steht, an dem das Message-Objekt der STL List hinzugefügt wurde. Desweiteren hat jedes Message-Objekt einen Delay-Wert in Sekunden.
Jedes Mal, wenn die Funktion aufgerufen wird, wird überprüft, ob die Zeit Now + das Delay des jeweiligen Message-Objekts überschritten wurde. Dann soll mit den Werten des Message-Objekts ein bisschen was angestellt werden und das Message-Objekt selbst soll aus der STL List entfernt werden. Quasi eine zeitgesteuerte Message Queue also.
Das Problem ist, daß mir die erase()-Funktion der STL Liste immer abstürzt, wenn das letzte Element der Liste gelöscht werden soll.
Wichtig ist vielleicht noch die OnClose-Funktion da, welche aufgerufen wird, wenn bCloseConnection wahr ist. Diese Funktion löscht die eigene Instanz.
Daß die Funktion nach Löschen des Client-Objekts nicht nochmal aufgerufen wird, habe ich Sorge getragen. Das bestätigt mir auch die Ausgabe der Print-Meldungen.
Hier der Code:
Ich habe eine Funktion, die sekündlich zyklisch aufgerufen wird. Sie iteriert über eine STL-List.
Die Elemente der Liste sind structs vom Typ Message.
Jede Message hat einen Timestamp Now, in welchem der Linux-Timestamp steht, an dem das Message-Objekt der STL List hinzugefügt wurde. Desweiteren hat jedes Message-Objekt einen Delay-Wert in Sekunden.
Jedes Mal, wenn die Funktion aufgerufen wird, wird überprüft, ob die Zeit Now + das Delay des jeweiligen Message-Objekts überschritten wurde. Dann soll mit den Werten des Message-Objekts ein bisschen was angestellt werden und das Message-Objekt selbst soll aus der STL List entfernt werden. Quasi eine zeitgesteuerte Message Queue also.
Das Problem ist, daß mir die erase()-Funktion der STL Liste immer abstürzt, wenn das letzte Element der Liste gelöscht werden soll.
Wichtig ist vielleicht noch die OnClose-Funktion da, welche aufgerufen wird, wenn bCloseConnection wahr ist. Diese Funktion löscht die eigene Instanz.
Daß die Funktion nach Löschen des Client-Objekts nicht nochmal aufgerufen wird, habe ich Sorge getragen. Das bestätigt mir auch die Ausgabe der Print-Meldungen.
Hier der Code:
Code:
void Client::SendDelayedMessages()
{
fprintf(stderr,"SendDelayedMessages()\n");
if(plDelayedMessages == NULL) return;
list<Message>::iterator iMessage = plDelayedMessages->begin();
while(!plDelayedMessages->empty() && iMessage != plDelayedMessages->end())
{
Message mMesg = *iMessage;
int iExecTime = mMesg.Now + mMesg.Delay;
int iRemaining = iExecTime - (int)time(NULL);
fprintf(stderr,"Size of lDelayedMessages : %i\n",plDelayedMessages->size());
if( iRemaining <= 0 )
{
int iNewState = mMesg.NewState;
char* text = mMesg.msg;
bool bClose = mMesg.bCloseConnection;
iMessage = plDelayedMessages->erase(iMessage); // Dieser Aufruf stürzt ab, sobald die letzte Message in der Liste bearbeitet wird.
Send(text);
if(iNewState >= 0) iState = iNewState;
if(bClose) OnClose();
continue;
}
iMessage++;
}
}