crossplatform.ru

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

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
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 запущена?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 16:12
Сообщение #11


Студент
*

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

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




Репутация:   0  


Что именно подразумевается под запуском очереди сообщений?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 16:14
Сообщение #12


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 16:12) *
Что именно подразумевается под запуском очереди сообщений?

QApplication::exec() уже работает? В main запускается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 16:16
Сообщение #13


Студент
*

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

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




Репутация:   0  


Разумеется, exec() уже выполнен, после чего я создаю потоки, привязываю сигналы... и... не получаю результата... Односторонний обмен выходит...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 16:19
Сообщение #14


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 16:16) *
Разумеется, exec() уже выполнен, после чего я создаю потоки, привязываю сигналы... и... не получаю результата... Односторонний обмен выходит...

Я специально набросал небольшой пример, что бы показать что должно работать. :)
Если у тебя не работает, то нужно смотреть твой код, так сказать, в большем объеме. Что-то ты делаешь не так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 16:26
Сообщение #15


Студент
*

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

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




Репутация:   0  


ну у меня отличия от примера только в том, что потоки создаются не в мейне, а именно, есть класс Server, а в мейне у меня описывается так:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Server server;
    server.show();
    srand(time(0));
    return server.exec();
}


Ну а уже в сервере создаются потоки и все остальное...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 16:47
Сообщение #16


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 16:26) *
return server.exec();

А почему не app.exec()?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 16:48
Сообщение #17


Студент
*

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

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




Репутация:   0  


Да потому, что разницы никакой, пробовал и app.exec(), результата 0....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 17:14
Сообщение #18


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 16:48) *
Да потому, что разницы никакой, пробовал и app.exec(), результата 0....

Ясно. :)
А что тебе программа в консоли пишет про moveToThread?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 17:17
Сообщение #19


Студент
*

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

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




Репутация:   0  


Ну в данном случае я вообще без moveToThread() делаю, а когда делал с этой функцией, не смотрел, что пишет, знаю, что сигналы переставали доходить в обе стороны... В общем, ничего не понимаю, что делаю не так...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 17:24
Сообщение #20


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 17:17) *
Ну в данном случае я вообще без moveToThread() делаю, а когда делал с этой функцией, не смотрел, что пишет, знаю, что сигналы переставали доходить в обе стороны... В общем, ничего не понимаю, что делаю не так...

moveToThread делать придется. А вот если ты указываешь parent для NThread, то moveToThread работать не будет и будет сообщать об этом в консоль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 17:28
Сообщение #21


Студент
*

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

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




Репутация:   0  


Нет, это я уже все вычитал, поэтому когда я использую эту функцию, я в качестве parent задаю 0, функция срабатывает нормально, иначе бы в дебаге выкинуло с ошибкой... а почему придется? Ведь в примере без нее все нормально работает... Кстати, я попробовал еще упростить в своей программе, в функции мейн написал:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Server server;
    server.show();
    srand(time(0));
    NThread *tmpThread = new NThread( 0 );
    QObject::connect( tmpThread, SIGNAL( endThreadSocket( PrioritySocket ) ), &server, SLOT( socketToList( PrioritySocket ) ) );
    tmpThread->start();
    return app.exec();
}

Thread, по-прежнему, в ране в цикле выдает сигналы... Результат тот же, в слот не попадаю, хоть ты тресни..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.12.2009, 17:32
Сообщение #22


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

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

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




Репутация:   44  


Цитата(OrSOn @ 8.12.2009, 17:28) *
а почему придется? Ведь в примере без нее все нормально работает...

В каком примере работает без нее?

Вызывать придется для того, чтобы connect создал подключение, которое будет работать через очередь сообщений.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 8.12.2009, 17:36
Сообщение #23


Студент
*

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

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




Репутация:   0  


Да, я тупанул, вижу, где в примере используется эта функция, вписал у себя, результата все еще нет...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.12.2009, 0:07
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


OrSOn, прочитай тему: Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 9:49
Сообщение #25


Студент
*

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

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




Репутация:   0  


Извиняюсь за оформление и спасибо за ссылку! А по теме... Я понял, почему у меня не работало, но не понимаю, с чем это связано. Суть в том, что я имел сигнал формата

void mySignal( PrioritySocket sgn)

Причем PrioritySocket - это структура из 2 полей( QTcpSocket *, int ). Так вот почему-то ее передавать из потока не хочет, хотя в поток она сигналом отлично отправлялась до введения moveToSocket. С чем это может быть связано?

Забыл добавить, что если вместо PrioritySocket передавать указатель на него, все отлично передается, но все равно хотелось бы понять, почему сам объект не пересылается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 9:49
Сообщение #26


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

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

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




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 9:46) *
Причем PrioritySocket - это структура из 2 полей( QTcpSocket *, int ). Так вот почему-то ее передавать из потока не хочет, хотя в поток она сигналом отлично отправлялась до введения moveToSocket. С чем это может быть связано?

int qRegisterMetaType ( const char * typeName )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 9:51
Сообщение #27


Студент
*

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

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




Репутация:   0  


Цитата(BRE @ 9.12.2009, 9:49) *
int qRegisterMetaType ( const char * typeName )


не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 9:56
Сообщение #28


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

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

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




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 9:51) *
Цитата(BRE @ 9.12.2009, 9:49) *
int qRegisterMetaType ( const char * typeName )


не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят...

Типы, которые используются в сигнал-слотах, должны быть известны мета-объектной системе Qt.

Сообщение отредактировал BRE - 9.12.2009, 9:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 9:57
Сообщение #29


Студент
*

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

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




Репутация:   0  


Тогда не понимаю, почему у меня из основного потока в дополнительный все отлично пересылалось. Ну да ладно, главное, что теперь знаю,к ак обойти сие дело. Спасибо большое за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 10:37
Сообщение #30


Студент
*

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

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




Репутация:   0  


Поспешил я с тем, что все получилось... Снова нужна помощь... Суть в том, что да, из потока теперь сигналы отсылаются, только вот в поток сигналы перестали доходить... Я вот попробовал несколько изменить приведенный выше пример, добавив в него обратный сигнал:

Пример

#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();
    }    
public slots:
    void signalReceived()
    {
        qDebug() << "Signal received.";
    }
              
};                     

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

signals:
    void received();

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

    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() ) );

    QObject::connect( &recv, SIGNAL( received() ), &thread, SLOT( signalReceived() ) );

    thread.start();

    return app.exec();
}

#include "main.moc"



Так вот в signalReceived() он не заходит...

Черт, снова напутал с оформлением, извиняюсь перед модераторами!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 10:41
Сообщение #31


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

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

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




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 10:37) *
Так вот в signalReceived() он не заходит...

Так в потоке не запущен цикл обработки событий (QThread::exec).
Все сигналы между потоками ходят через события, а если события не обрабатываются, то и сигналы не доходят.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 10:51
Сообщение #32


Студент
*

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

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




Репутация:   0  


Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 11:05
Сообщение #33


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

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

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




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 10:51) *
Хммм но ведь если я в потоке вызову exec(), то на нем выполнение потока остановится, до полезных команд не дойдет. Если не сложно, хотелось бы увидеть простенький пример, как передавать сигналы в поток... Коненчо, туда-то сигналы можно не передавать, можно обойтись функциями, ибо доступ к потокам у меня свободный, но хочется разобраться на будущее...

Я не поклонник такого использования сигналов в потоках, проще и IMHO лучше, не держать поток в простое на каком то флажке, а запускать его в тот момент, когда нужно что-бы он что-то сделал. После завершения работы она завершиться и все.

Но если очень хочется, то можно делать примерно так:
Раскрывающийся текст

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

public slots:
    void job1()
    {
        qDebug() << "Job 1";
        ...
    }

    void job2()
    {
        qDebug() << "Job 2";
        ...
    }

protected:
    void run()
    { 
        exec();
    } 
};


Если соединится со слотами job1 и job2 из другого потока, то при активации они будут выполняться в контексте потока.
Т.е. нет нужды ждать в потоке изменение какого-то флага и запускать действие, QThread::exec сам будет ждать сигнала и запустит действие (нужный слот).

Сообщение отредактировал BRE - 9.12.2009, 11:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:08
Сообщение #34


Студент
*

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

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




Репутация:   0  


Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.12.2009, 11:13
Сообщение #35


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

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

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




Репутация:   44  


Цитата(OrSOn @ 9.12.2009, 11:08) *
Спасибо огромное! Сейчас испытаю. А запущенные и простаивающие потоки, увы, нужны мне... Потому что, во-первых, у меня стоит ограничение на количество запущенных потоков, а во-вторых, 1 событие может вызвать несколько сотен обращений к потоку, так что лучше пусть он будет уже готов и не придется создавать несколько сотен новых потоков, удаляя их через короткое время...

Если задачи таковы, то конечно нужно использовать...
Посмотри еще на QThreadPool.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:16
Сообщение #36


Студент
*

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

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




Репутация:   0  


К сожалению, у меня Qt 4.3, там его еще нету, но все равно гляну, спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.12.2009, 11:43
Сообщение #37


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(OrSOn @ 9.12.2009, 12:51) *
не совсем понял, к чему это? Ведь отдельно int в сигнале передается, отдельно QTcpSocket * передается, а в структуре вместе не хотят...
из описания к макросу Q_DECLARE_METATYPE ( Type ):
Цитата
Note that if you intend to use the type in queued signal and slot connections, you also have to call qRegisterMetaType() since such connections are resolved at runtime.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
OrSOn
  опции профиля:
сообщение 9.12.2009, 11:55
Сообщение #38


Студент
*

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

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




Репутация:   0  


Ясно, спасибо =)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.7.2025, 3:42