Я пытаюсь реализовать небольшое приложение, которое является графическим приложением, и имеет некоторую тяжелую работу, чтобы сделать его одной из основных задач. Очевидно, я помещаю эту «работу» в отдельный поток и запускаю этот поток, вызывая start fnc на этом объекте. К сожалению, ничего не происходит. С другой стороны, когда вместо запуска я вызываю выполненные вычисления fnc run, выполняются так, как они должны, хотя, конечно, в том же потоке, что и gui. Что делать?
Так что у меня класс наследующий QThread:start не вызывает запуск
class Working_Thread : public QThread
{
Q_OBJECT
public:
typedef boost::filesystem3::path path_t;
private:
bool& cancel_flag_;
const std::set<path_t>& paths_;
int search_depth_;
typedef void (Dir_File_Select_Dialog::*fnc_ptr)(const std::set<path_t>&,int);
fnc_ptr fnc_;
Dir_File_Select_Dialog* parent_;
protected:
void run()
{
(parent_->*fnc_)(paths_,search_depth_);
}
public:
Working_Thread(bool& cancel_flag,const std::set<path_t>&,int&,fnc_ptr fnc,Dir_File_Select_Dialog* parent);
};
А вот фрагмент из графического интерфейса поток, когда я пытаюсь начать новую тему:
Working_Thread* working_thread = new Working_Thread(cancel_flag,paths,search_depth,&Dir_File_Select_Dialog::extract_files_,this);
working_thread->start();//this desn't invoke run fnc
но когда я делаю:
working_thread->run();//this will perform computations although in gui thread
UPDATE:
Небольшое изменение, которое я сделал, которое теперь выполняет вычисления при использовании start fnc, но оно по-прежнему блокирует GUI.
Working_Thread* working_thread = new Working_Thread(cancel_flag,paths,search_depth,&Dir_File_Select_Dialog::extract_files_,this);
working_thread->start();//hangs
working_thread->wait();//when I call wait here computation is performed but GUI is blocked.
Некоторые примечания: 1. Как вы понимаете, что запуск был/не был вызван? 2. Почему ваш объект GUI выполняет некоторые вычисления? Связаны ли они с графическим интерфейсом? Понимаете ли вы, что все GUI-операции должны вызываться в потоке графического интерфейса, и только каждая часть Qt не является потокобезопасной? – Lol4t0
@ Lol4t0 1. run не был вызван, потому что я не вижу никакого эффекта, никакие результаты не отображаются на представлении, в отличие от того, когда я запускаю его напрямую. 2. Gui не выполняет никаких вычислений, откуда вы это понимаете, и да, я понимаю. – smallB
Попробуйте добавить простой отладочный вывод для работы. Если вы хотите изменить вид, это означает, что вы уже изменили _perform_ Gui в другом потоке. – Lol4t0