crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Qthread & сигналы
OrSOn
  опции профиля:
сообщение 8.12.2009, 15:18
Сообщение #1


Студент
*

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

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




Репутация:   0  


Добрый день всем! Столкнулся со следующей проблемой... Есть программа, в которой нужно использовать потоки, причем основной поток должен обмениваться сигналами с вновь созданными. Так вот проблема примерно в следующем:

Попробовал просто все подключить коннектами, в результате thread принимает мои сигналы, но сам их испускать не может.
Попробовал в начале run() вписывать exec(), в результате до нужного участка кода, разумеется, поток не доходил
Попробовал способ с moveToThread(), сделал примерно следующее:

thread1 = new NThread(0);
thread1->moveToThread( thread1 );
connect(thread1, SIGNAL(endThreadSocket( PrioritySocket )), this, SLOT(socketToList( PrioritySocket )));
connect(this, SIGNAL(setSocket1( PrioritySocket )), thread1, SLOT(setThreadSocket( PrioritySocket )));
thread1->start();


При этом поток вообще не видит испускаемых мной сигналов. Подскажите, пожалуйста, что именно делаю не так и как заставить все это дело нормально взаимодействовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 8.12.2009, 15:21
Сообщение #2


Активный участник
***

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

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




Репутация:   1  


У Саборга в блоге, что-то такого было, вроде это :
http://vingrad.ru/blogs/sabrog/2009/06/11/...d-myunhgauzena/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 15:28
Сообщение #3


Студент
*

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

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




Репутация:   0  


Увы, это не то( Там написано, что сигналы из run() нормально обрабатываются... А у меня основной поток их ВООБЩЕ не видит...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 15:31
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 15:28) *
Увы, это не то( Там написано, что сигналы из run() нормально обрабатываются... А у меня основной поток их ВООБЩЕ не видит...

Так ты бы кода побольше показал... Что там в run у тебя, как отсылаешь, как принимаешь... ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 15:36
Сообщение #5


Студент
*

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

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




Репутация:   0  


Ну внутри рана у меня следующее:

void NThread::run()
{
    while( !threadEnd )
    {    
        if( setSocketFlag )
        {
            setSocketFlag = false;
            setThreadSocketFn();
        }

        msleep( 100 );
    }
}

setSocketFlag у меня задается в слоте, который принимает сигнал от основного потока. Т.е. ран крутится, пока основной поток не передаст сигнал. Передал, попали в функцию setThreadSocketFn(). Внутри этой функции ведется некоторая обработка, после чего написано:

emit endThreadSocket( PrioritySocket );

как написано выше, в основном потоке идет привязка этого сигнала к слоту... но внутрь слота я так и не попадаю, такое ощущение, что слот не испускается...
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 15:54
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 15:36) *
как написано выше, в основном потоке идет привязка этого сигнала к слоту... но внутрь слота я так и не попадаю, такое ощущение, что слот не испускается...

Набросал небольшой рабочий пример:
Раскрывающийся текст

#include <QApplication>          
#include <QThread>              
#include <QDebug>                

class Thread : public QThread
{                            
    Q_OBJECT                
public:                      
    Thread() : QThread( 0 ) { moveToThread( this ); }

signals:
    void started();
    void stopped();

protected:
    void run()
    {        
        emit started();
        sleep( 2 );    
        emit stopped();
    }                  
};                    

class Recv : public QObject
{
    Q_OBJECT
public:
    Recv() : QObject( 0 ) {}

public slots:
    void threadStarted()
    {
        qDebug() << "Thread started.";
    }

    void threadStopped()
    {
        qDebug() << "Thread stopped.";
    }
};

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

    Recv recv;
    Thread thread;

    QObject::connect( &thread, SIGNAL( started() ), &recv, SLOT( threadStarted() ) );
    QObject::connect( &thread, SIGNAL( stopped() ), &recv, SLOT( threadStopped() ) );

    thread.start();

    return app.exec();
}

#include "main.moc"

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 15:57
Сообщение #7


Студент
*

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

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




Репутация:   0  


В том и проблема, что суть та же, но у меня не принимаются сигналы, хоть ты тресни...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 16:02
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 15:36) *
Т.е. ран крутится, пока основной поток не передаст сигнал. Передал, попали в функцию setThreadSocketFn(). Внутри этой функции ведется некоторая обработка, после чего написано:

А в setThreadSocketFn точно попадаешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 16:07
Сообщение #9


Студент
*

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

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




Репутация:   0  


Да. Попробовал только что вообще просто все сделать... В своем основном потоке объявляю thread

thread1 = new NThread(this);
connect(thread1, SIGNAL(endThreadSocket( PrioritySocket )), this, SLOT(socketToList( PrioritySocket )));
connect(this, SIGNAL(setSocket1( PrioritySocket )), thread1, SLOT(setThreadSocket( PrioritySocket )));
thread1->start();


Т.е. ТОЛЬКО запустил конструктор и вошел в ран().

Ран описан очень просто:

void NThread::run()
{
   while( 1 > 0 )
   {    
      emit endThreadSocket( priorSocket );
      msleep( 100 );
   }
}


Так вот тот самый эмит он проходит непрерывно, но в слот socketToList( PrioritySocket ) упорно отказывается попадать. Причем если тот же сигнал испустить ВНЕ функции ран(), все отлично перехватывается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 16:11
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 16:07) *
Так вот тот самый эмит он проходит непрерывно, но в слот socketToList( PrioritySocket ) упорно отказывается попадать. Причем если тот же сигнал испустить ВНЕ функции ран(), все отлично перехватывается...

Очередь сообщений QApplication запущена?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 25.4.2024, 22:36