C++ (Qt)class Thread : public QThread{ Q_OBJECT public: Thread(); protected: void run(); private slots: void broadcastDatagram(); private: QUdpSocket *udpSocket; int messageNo;};
C++ (Qt)Thread::Thread() : QThread( 0 ), messageNo( 1 ){ moveToThread( this );} void Thread::run(){ udpSocket = new QUdpSocket; QTimer timer; connect( &timer, SIGNAL( timeout() ), SLOT( broadcastDatagram() ) ); timer.start( 1000 ); exec();} void Thread::broadcastDatagram(){ QByteArray datagram = "Broadcast message " + QByteArray::number( messageNo ); udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::LocalHost, 45454); ++messageNo;}
Thread::Thread() : QThread( 0 ), messageNo( 1 ){ moveToThread( this );}
C++ (Qt)int main(...){ // Контекст первого потока Thread *thread = new Thread; // Конструируем объект thread, он пренадлежит контексту первого потока.}
C++ (Qt)void Thread::run(){ // Появился контекст второго потока. QTimer timer; // Объект timer принадлежит контексту второго потока. // При соединении сигнала от объекта timer, который принадлежит второму потоку, со слотом объекта thread, который принадлежит первому потоку, // будет выбран метод передачи сигналов через очередь событий, т.е. когда в потоке сработает таймер сообщение об этом будет помещено в очередь событий // первого потока, соответсвенно слот будет отрабатывать из очереди первого потока. // Нам это не нужно! Поэтому мы сообщаем Qt, что мы хотим считать объект thread принадлежащим контексту второго потока. connect( &timer, SIGNAL( timeout() ), SLOT( broadcastDatagram() ) );}