QThread的Qt文档说是从QThread创建一个类,并实现run方法.
以下内容来自4.7 Qthread文档......
要创建自己的线程,请继承QThread并重新实现run().例如:
class MyThread : public QThread
{
public:
void run();
};
void MyThread::run()
{
QTcpSocket socket;
// connect QTcpSocket's signals somewhere meaningful
...
socket.connectToHost(hostName, portNumber);
exec();
}
Run Code Online (Sandbox Code Playgroud)
所以在我创建的每一个线程中,我都做到了这一点,并且对于大多数事情来说它工作正常(我没有在我的任何对象中实现moveToThread(this)并且它工作得很好).
我上周遇到了障碍(设法通过解决我创建对象的地方来解决它)并找到了以下博文.这里基本上说子类化QThread确实不是正确的方法(并且文档不正确).
这是来自Qt的开发人员,所以乍一看我很感兴趣,经过进一步的反思,同意他.按照OO原则,你真的只想子类化一个类来进一步增强该类......不要直接使用类方法......这就是为什么要实例化...
让我们说我想将一个自定义QObject类移动到一个线程......这样做的"正确"方法是什么?在那篇博客文章中,他说'他在某个地方有一个例子......但如果有人可以向我进一步解释它,我将不胜感激!
更新:
由于这个问题引起了如此多的关注,下面是4.8文档的复制和粘贴,以及实现QThread的"正确"方式.
class Worker : public QObject
{
Q_OBJECT
QThread workerThread;
public slots:
void doWork(const QString ¶meter) {
// ...
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = …Run Code Online (Sandbox Code Playgroud) 在尝试了解我所知道的一切之后,甚至通过添加
QT_MainWindow::QT_MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::QT_MainWindow)
{
ui->setupUi(this);
qRegisterMetaType<QTextCursor>("QTextCursor");
qRegisterMetaType<QTextBlock>("QTextBlock");
}
Run Code Online (Sandbox Code Playgroud)
对于我的源代码,我仍然无法修改QTextEdit和QPlainTextEdit中其他线程的文本,我也在使用OpenMP和Qt.
任何人都可以告诉我从QTextEdit和QPlainTextEdit中的其他线程修改文本的正确方法是什么,因为我没有找到任何关于它的帮助我
这是我的来源:
void QT_MainWindow::Load()
{
ui->QT_PlainTextEdit->setPlainText("");
std::ifstream file("File.txt");
std::string line;
#pragma omp parallel
{
while ( std::getline(file, line) )
ui->QT_PlainTextEdit->appendPlainText( QString::fromStdString(line));
file.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我设法让它像这样工作
void QT_MainWindow::Load()
{
omp_set_dynamic(0);
omp_set_nested(3);
#pragma omp parallel num_threads(3)
{
ui->QT_PlainTextEdit->setPlainText("");
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试设置文本
void QT_MainWindow::Load()
{
omp_set_dynamic(0);
omp_set_nested(3);
#pragma omp parallel num_threads(3)
{
ui->QT_PlainTextEdit->setPlainText("TEST");
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
QObject: Cannot create children for a parent that is in a different thread.
(Parent is …Run Code Online (Sandbox Code Playgroud) 在我的(Qt-)程序中,我需要一个从外部源获得的值的连续请求.但我不希望这个请求冻结整个程序,所以我为这个函数创建了一个单独的线程.但即使它在一个单独的线程中运行,GUI也会冻结.为什么?
请求函数的代码:
void DPC::run()
{
int counts = 0, old_counts = 0;
while(1)
{
usleep(50000);
counts = Read_DPC();
if(counts != old_counts)
{
emit currentCount(counts);
old_counts = counts;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Read_DPC()返回我想要发送到GUI中的lineEdit的int值.
主要类看起来像
class DPC: public QThread
{
Q_OBJECT
public:
void run();
signals:
void currentCount(int);
};
Run Code Online (Sandbox Code Playgroud)
此代码在main函数中调用为:
DPC *newDPC = new DPC;
connect(newDPC, SIGNAL(currentCount(int)), SLOT(oncurrentCount(int)));
connect(newDPC, SIGNAL(finished()), newDPC, SLOT(deleteLater()));
newDPC->run();
Run Code Online (Sandbox Code Playgroud)
如何防止此代码冻结我的GUI?我究竟做错了什么?谢谢!