Добрый день!
Уже прочитал кучу статей, но так и не дошло как это реализовать:
Начну попорядку:
Есть
C++ (Qt)
class ChatModule : public WebModule
{
public:
ChatModule(QString handle, QString password, QString logDir);
virtual int checkNewRequest ();
virtual int openChat();
virtual int getChatMessage();
virtual int sendChatMessage(msg);
UserAgent ua;
};
Упростил функции очень сильно, но суть главная осталась,
класс UserAgent ничто иное как обычный HTTP клиент, причем СИНХРОННЫЙ, который использует QNetworkAccessManage;
C++ (Qt)
class UserAgent: public QObject
{
public:
QNetworkAccessManager *m_nam;
UserAgent(QString handle);
virtual ~UserAgent();
int get (QString url)
{
QEventLoop loop;
reply = m_nam->get (req);
connect (reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
}
};
сам поток
C++ (Qt)
class ChildThread : public QThread
{
public:
enum Statuses {statusOpen=0, statusCheck};
ChildThread (ChatModule *module)
{
m_chat = module;
m_chat->logMsg("Child create");
}
virtual ~ChildThread ()
{
m_chat->logMsg ("delete child");
}
virtual void run()
{
int status = 0;
while (true)
{
if (status == ChildThread::statusOpen)
{
if(m_chat->openChat())
status = ChildThread::statusCheck;
else
break;
}
if (status == ChildThread::statusCheck)
{
if (m_chat->getChatMessage())
{
// Obrabotka
}
}
m_chat->logMsg("Sleep SLEEP_TIME sec");
QEventLoop loop;
QTimer::singleShot( SLEEP_TIME * 1000, &loop, SLOT( quit() ));
loop.exec();
}
m_chat->logMsg("Child end.");
}
private:
ChatModule *m_chat;
};
главная тело программы
C++ (Qt)
ChatModule chatModule("username", "password", "logDir");
chatModule.login ();
while (true)
{
if (chatModule.checkNewRequest ())
{
ChildThread *thread = new ChildThread(&chatModule);
thread->connect (thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
}
после старта вижу
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x3e55c8), parent's thread is QThread(0x3e3e50)
, current thread is QThread(0xc8a118)Причем это валится когда я пытаюсь сделать
C++ (Qt)
ChatModule::openChat {} { ua->get("blablalba"); }
Через некоторое время
ASSERT failure in QEventLoop::exec(): "internal error", file kernel/qeventloop.c
pp, line 225
Вопрос: как передать объект chatModule в НЕСКОЛЬКО тредов ?Проблемы синхронизации контента решены в самом модуле UserAgent с помощью мутексов.