ich habe wieder mal eine Frage. ich hab einen Server geschrieben, der für jeden Client einen neuen Thread aufmacht. Wenn man sich jetzt via telnet auf diesem Server authentifiziert (analog zu POP3), dann ruft das thread eine funktion aus einer anderen (nicht thread)-Klasse auf und übergibt ihr einen String als Parameter. Die Funktion aus der fremden Klasse, welche den String zusammenbaut ist relativ primitiv
Code: Alles auswählen
void database::test(QString data)
{
std::cout << QString("hier ist ein langer String wo zwischendrinn irgendwann %1 vorkommt").arg(data).toStdString() << std::endl;
}
Das Thread selbst hat diese Struktur, der Funktionsaufruf von test() ist "etwas hervorgehoben"
Code: Alles auswählen
void serverThread::run()
{
QTcpSocket tcpSocket;
/* irrelevantes weggelassen */
for (int i = 0; connected; i++)
{
tcpSocket.waitForReadyRead(-1);
QString incoming = QString(tcpSocket.readAll());
incoming.truncate(incoming.length()-1);
if (incoming.startsWith("ping"))
{
/* ****************************** */
db->test(incoming); //HIER IST DER FUNKTIONSAUFRUF
/* ****************************** */
}
/* Hier wurden sämtliche irrelevanten else if weggelassen
* Im Prinzip wird hier noch der korrekte Login a la
* > 'user jowin123'
* > 'pass 1234567'
* abgehandelt, ansonsten passiert hier nichts
*/
}
tcpSocket.disconnectFromHost();
}Wo liegt jetzt das Problem, naja wenn ich in Telnet das Kommando "ping" an den Server sende, dann gibt der Server folgendes aus:
anstattvorkommtein langer String wo zwischendrinn irgendwann ping
PS.: man beachte beim ersten Zitat das Leerzeichen am beginnhier ist ein langer String wo zwischendrinn irgendwann ping vorkommt
Ich bin mit meinem Latein am Ende und würde mich über Tipps freuen. Aber ich vermute, dass dieses Problem mit der Threadsicherheit zusammenhängt.
LG