crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QThread, QEvent, QTcpServer, взаимодействия между потоками
512es
  опции профиля:
сообщение 10.11.2008, 16:00
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


всем привет!

пишу многопоточный высокопроизводительный сервер на qt.

сервер прослушивает коннекты на определённый порт и на каждое входящее соединение создаёт отдельный поток.
при каждом пришедшем пакете поток отсылает главному потоку сообщение через customEvent.

вроде работает, только не знаю как правильнее заставить все дочерние потоки (или один выборочно) отослать определённый пакет клиентам?


закинул все потоки массив QVector и передаю в customEvent главного потока ид того кто отправил. правильный путь ли я выбрал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 13.11.2008, 14:30
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Вот я пример набросал, правда с рисованием, но думаю идея будет понятна... :)
Раскрывающийся текст
main.cpp
#include <QtCore/QCoreApplication>

#include "xThread.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    CxThread thread[2];
    for( int n=0; n < sizeof( thread)/sizeof( *thread); ++n)
    {
        thread[n].start();
    }

    while( true)
    {
        for( int n=0; n < sizeof( thread)/sizeof( *thread); ++n)
        {
            if( thread[n].isRunning())
                emit thread[n].drawText();
        }
        thread[0].sleep( 1);
        qDebug( "**********************");
    }

    return a.exec();
}

xThread.h
#ifndef XTHREAD_H
#define XTHREAD_H

#include <QThread>
#include <QMutex>

class CxPrint;

class CxThread : public QThread
{
    Q_OBJECT

private:
    static QMutex m_mutex;
    int        m_n;
    CxPrint *m_pPrint;

public:
    CxThread(QObject *parent=0);
    ~CxThread();

    void drawText();
    static void sleep ( unsigned long uls);
    int GetN()const { return m_n; }

protected:
    virtual void run();
    
};

class CxPrint: QObject
{
    Q_OBJECT

public:
    void drawText();

signals:
    void signalDrawText();

protected slots:
    void slotDraw();

public:
    CxPrint(void);
    virtual ~CxPrint(void);
};


#endif // XTHREAD_H

xThread.cpp
#include "xThread.h"
#include "xPrint.h"

QMutex CxThread::m_mutex;

CxThread::CxThread(QObject *parent)    : QThread(parent)
{
    m_n=0;
    m_pPrint = 0;
}

CxThread::~CxThread()
{
    delete m_pPrint;
    m_pPrint = 0;
}

void CxThread::drawText()
{
    if( m_pPrint)
        emit m_pPrint->drawText();
}

void CxThread::sleep ( unsigned long uls)
{
    QThread::sleep( uls);
}

void CxThread::run()
{
    {
        QMutexLocker locker(&m_mutex);
        static int n = 1;
        m_pPrint = new CxPrint;
        qDebug( "Runing thread with id: 0x%x, thread N: %d", QThread::currentThreadId(), n);
        m_n = n;
        n++;
    }

    CxThread::exec();
}

CxPrint::CxPrint(void)
{
    connect( this, SIGNAL( signalDrawText()), this, SLOT( slotDraw()));
}

CxPrint::~CxPrint(void)
{
}

void CxPrint::slotDraw()
{
    qDebug( "Draw in thread with id: 0x%x, thread N: %d", QThread::currentThreadId(), ((CxThread*)QThread::currentThread())->GetN());
}

void CxPrint::drawText()
{
    emit signalDrawText();
}


Сообщение отредактировал ViGOur - 13.11.2008, 14:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 512es   QThread, QEvent, QTcpServer   10.11.2008, 16:00
- - Litkevich Yuriy   Цитата(512es @ 10.11.2008, 19:00) при каж...   10.11.2008, 16:27
- - ViGOur   Если я тебя правильно понял, то тебе нужен менедже...   10.11.2008, 16:48
- - 512es   Litkevich Yuriy, customEvent потому что хочу всё ч...   10.11.2008, 19:05
- - Litkevich Yuriy   Цитата(512es @ 10.11.2008, 22:05) а как я...   10.11.2008, 19:16
- - ViGOur   Цитата(Litkevich Yuriy @ 10.11.2008, 19:1...   11.11.2008, 0:19
- - 512es   Цитата(ViGOur)В том потоке в котором был создан об...   11.11.2008, 11:53
- - ViGOur   Цитата(512es @ 11.11.2008, 11:53) а как л...   11.11.2008, 13:23
- - Litkevich Yuriy   Мысль в слух: Нельзя ли сделать один поток для авт...   11.11.2008, 15:05
- - 512es   Цитата(Litkevich Yuriy)если авторизованый пользова...   12.11.2008, 0:43
- - ViGOur   Цитата(512es @ 12.11.2008, 0:43) через си...   12.11.2008, 8:29
- - 512es   вообще, это мой первый проект на Qt, потому прошу ...   12.11.2008, 13:06
- - 512es   попробовал через сигнал\слот.. connect(th...   12.11.2008, 15:02
- - 512es   вообщем, всю голову сломал, не знаю как сделать( ...   13.11.2008, 12:27
- - ViGOur   Цитата(512es @ 13.11.2008, 12:27) не ужел...   13.11.2008, 13:17
- - ViGOur   Вот я пример набросал, правда с рисованием, но дум...   13.11.2008, 14:30
- - 512es   ViGOur, спасибо!) то что надо!)) у меня ро...   13.11.2008, 16:42
- - ViGOur   Цитата(512es @ 13.11.2008, 16:42) ViGOur,...   13.11.2008, 18:01
- - 512es   разве что от CxThread::drawText() удалось избавить...   15.11.2008, 1:19
- - Litkevich Yuriy   Цитата(512es @ 15.11.2008, 4:19) вообще с...   15.11.2008, 1:29
- - ViGOur   Цитата(Litkevich Yuriy @ 15.11.2008, 1:29...   15.11.2008, 10:28
- - 512es   ViGOur, провёл эксперимент: подключился двумя клие...   20.11.2008, 13:52
- - ViGOur   Цитата(512es @ 20.11.2008, 13:52) а если ...   20.11.2008, 15:21
- - 512es   тут просто разные нужды. мне важно чтобы все юзвер...   20.11.2008, 16:59
- - ViGOur   Цитата(512es @ 20.11.2008, 16:59) тут нем...   20.11.2008, 20:21


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.6.2024, 4:44