void TSignalReceiver::run( ){ int ioSize = 0; bool timedOut = false; static uint azimuth = 0; QString strPortData = "3111"; while ( !isDone( ) ) { if ( paused( ) ) { // если поток приостановлен - ждем... currentThread( )->msleep( pausedThreadDelay ); continue; } CNetworkStd::closeSocket( socket ); socket = CNetworkStd::connectClientTcp(settings.stationIp.toAscii( ), strPortData.toAscii( ), 1000, &timedOut ); if ( socket == invalid_socket ) { // обработка... continue; } while ( !isDone( ) ) { if ( paused( ) ) { // если поток приостановлен - ждем... currentThread( )->msleep( pausedThreadDelay ); continue; } if ( CNetworkStd::recvData( socket, reinterpret_cast< char* >( &packetFromHw ), // структура, куда записываютс данные sizeof( packetFromHw ), ioSize, 3000, &timedOut ) == false ) { if ( timedOut ) { // обработка continue; } } qDebug() << "Az = " << packetFromHw.Az; // эта строка выводится каждый раз, когда пришли данные emit onRecvSignal(); // если данные получены отослать сигнал !!!!!!
connect(tSignReceiv,SIGNAL(onRecvSignal()),indWin,SLOT(slotDrawIndicat()));
void COpenGlEngine::slotDrawIndicat(){ int az = packetFromHw.Az; qDebug() << "Az = " << az; // а здесь уже данные выводятся не каждый раз, а через 3-4 раза.. // хотя сигнал отсылается каждый раз, как данные в полном объеме получены ...}
struct dataPacket { dataPacket( ) : Az( 0 ), TpCnt( 0 ), nagcFactor( 0 ), isJammer( 0 ) { qMemSet( data, 0, sizeof( uchar ) * distancePoints ); } alt_u16 Az; alt_u16 TpCnt; alt_u8 data[2400]; alt_u8 nagcFactor; alt_u8 isJammer; alt_8 dummy[ 2 ]; };
class TSignalReceiver : public TAbstractThread { .... }class TAbstractThread : public QThread { ... }
class TSignalReceiver : public TAbstractThread { Q_OBJECT public: TSignalReceiver( const QString& name, QObject* parent = 0 ); virtual ~TSignalReceiver( ); virtual void stop( ); signals: void togglePeriod( ); void setRadiation( int ); void onRecvSignal(); protected: virtual void run( ); private: networkEvents netEvt; network::socket_type socket; };
TSignalReceiver::TSignalReceiver(const QString& name, QObject* p ) : TAbstractThread( name, p ), socket( 0 ){ }
class TAbstractThread : public QThread { Q_OBJECT public: TAbstractThread( const QString& name, QObject* parent = 0 ); virtual ~TAbstractThread( ) = 0; virtual void stop( ); virtual bool isDone( ) const; virtual void setPause( bool p ); virtual bool waitForPaused( uint msec = -1 ); virtual bool paused( ) const; virtual QString name( ) const; signals: void setGlobalStatus( int sys, int state ); void updateStationStatus( const SStatus& st ); private: volatile bool done__; volatile bool pause__; QString name__; mutable QMutex mut__; mutable QWaitCondition wcPause__; };