Целый день бьюсь над проблемой:
Имеется клиент-серверное приложение. Наследник QTcpServer'а хранит в QMap<QString, Thread*> имена подключившихся пользователей и указатели на обслуживающие их нити.
Как только "правильность" подключившегося пользователя подтверждается, обслуживающая нить (наследник QThread'а) эмитит сигнал clientVerificationDone(QString userName, Thread* thread). Сигнал перехватывает сервер и добавляет пару имя/пользователя в QMap.
Беда в том, что иногда нужно передать сообщение от одного пользователя другому... Сейчас реализовано так:
получив сообщение от конечного пользователя нить эмитит сигнал messageSended(QByteArray from, QString to, QByteArray message); сигнал обрабатывается сервером в методе forwardMessage(). В методе мы находим указатель на нить получателя и вызываем метод этой нити, который и отсылает сообщение:
void Server::incomingConnection(int socketDescriptor)
{
Thread *thread = new Thread(socketDescriptor, this);
/* ... */
connect(thread, SIGNAL(messageSended(QByteArray, QString, QByteArray)), SLOT(forwardMessage(QByteArray, QString, QByteArray)), Qt::DirectConnection);
/* ... */
}
void Server::forwardMessage(QByteArray from, QString to, QByteArray message)
{
if (threads.contains(to))
threads[to]->sendMessage(from, message);
}
Проблема в том, что таким образом конечный пользователь может отослать сообщение только сам себе...
forwardMessage() будет запущен в потоке отправителя, а внутри вызывается метод из потока получателя
Можно как-нибудь явно вызывать threads[to]->sendMessage(from, message) из потока threads[to]?
Или может есть другой метод решения проблемы?