Краткий ответ: Запустите ваш поток, вызвав aThread->start();
, а не run()
, и убедитесь, что метод run () вашего потока защищен (не публично).
Пояснение
Вызов start()
является правильным способом для запуска потока, поскольку он обеспечивает планирование приоритетов и фактически выполняет метод run()
в своем собственном контексте потока.
Похоже, вы собираетесь загружать изображения в этой теме, поэтому я собираюсь включить несколько советов, прежде чем вы столкнетесь с ловушками, с которыми сталкиваются многие люди при использовании QThread
- Q Сам по себе поток - это не нить. Это всего лишь обертка вокруг нити, что приводит нас к ..
- сигналы / слоты, определенные в классе
CameraThread
, не обязательно будут выполняться в контексте потока , помните, только метод run () и вызываемые из него методы выполняются в отдельном потоке.
ИМХО, создание подкласса QThread в большинстве дел - это , а не . Вы можете сделать это намного проще с помощью следующего кода, и это сэкономит вам много головных болей.
class ImageLoader : public QObject {
Q_OBJECT
public slots:
void doWork()
{
// do work
}
};
void MainWindow::MainWindow(/*params*/)
{
ImageLoader loader;
QThread thread;
loader.moveToThread( &thread );
connect( this, SIGNAL( loadImage() ), &loader ,SLOT( doWork() ) );
thread.start();
// other initialization
}
void MainWindow::LoadImage()
{
emit loadImage();
}
Также читайте блог Qt по этой теме.