[lamer mode] Глупые вопросы по потокам.

capxaH

Пусть есть класс

class A {
public:
void f; // допустим жесткие вычисления
void g; // допустим отрисовка в окне
private:
// some data
};

и есть некая ф-ция (запускается при нажатии на кнопку например) из основного потока

void launcher(A* sample)
{
boost::thread my_thread( boost::bind( &A::f, sample ) ); // запускаем метод f класса A в потоке
}

или даже такая

void launcher2(A* sample)
{
QtConcurrent::run( boost::bind( &A::f, sample ) ); // ведут себя одинаково вроде
}

или даже они могут являться членами класса A.
А вопрос собственно такой, как по завершении потока запустить ф-цию g класса A, но уже из основного потока?
Или даже как завершении потока запустить какую-либо ф-цию из основного потока?
Такой вариант

void launcher3(A* sample)
{
boost::thread my_thread( boost::bind( &A::f, sample ) );
my_thread.join;
sample->g;
}

не устраивает так как тогда будет "заморожен" основной поток.

agaaaa

А что должен основной поток делать пока работает дополнительный?
Если он выполняет что-то в цикле, то пусть заодно проверяет, не завершился ли подчинённый поток, и выполняет g, если тот завершился.

Andbar

Система?
Под виндой вопрос решается отправкой сообщения в основной поток (предполагается что он в основном занят циклом обработки сообщений).

capxaH

Ну да. Видимо в этом и вопрос. Как послать сообщение из поражденного потока в основной.
Основной поток - Qtшный Гуй интерфейс. И он действительно занят циклом обработки сообщений от пользователя.
Пробовал всякие сигналы в конце ф-ции f, но они вызывают g в том же потоке.
Желатеьно конечно дописать в конце ф-ции f нечто что послало бы сообщение в основной поток и вызвало ф-цию g. Так как лезть в цикл обработки не особо хочется. Но если уж придется как узнать кончился ли поражденный поток?

valodyr

Пробовал всякие сигналы в конце ф-ции f, но они вызывают g в том же потоке.
Если я правильно помню, у каждого QObject есть «свой» тред, в котором он и будет обрабатывать сигналы. Если послать сигнал QObject'у, принадлежащему другому треду, то сигнал там и будет обработан.
При этом, конечно, тип соединения должен быть queued или auto.
Вообще, вот: http://doc.trolltech.com/4.2/threads.html#signals-and-slots-...
Оставить комментарий
Имя или ник:
Комментарий: