我在我的QT程序中使用多线程。我需要将数据传递给来自主gui线程的工作线程中的worker对象。我在QObject子类中创建了一个setData函数来传递主要gui线程中的所有必要数据。但是我通过查看setData函数中的QThread :: currentThreadId()来验证函数是从主线程调用的。即使worker对象函数是从主线程调用的,这是否确保工作线程仍然拥有自己的数据副本(这是重入类所需的)?请记住,这是在工作线程启动之前发生的。QT多线程数据从主线程传递给工作线程
此外,如果在没有动态内存的类中使用基本数据类型,并且只要其所有其他成员数据都是可重入的,那么没有静态全局变量就是该类可重入的? (它有折返数据成员一样将QString,qlists等加上基本整数布尔变量等)
感谢您的帮助
编辑新的内容:
我的主要问题是根本适合从主gui线程中调用另一个线程中的QObject子类方法,以便将我的数据传递给工作线程以进行工作(在我的情况下,包含备份作业信息的自定义类用于长待处理文件扫描和数据备份)。数据传递全部发生在线程启动之前,所以两个线程都没有同时修改数据的危险(我认为但我不是多线程专家......)听起来好像从你的文章中这样做的方式是使用从主线程到工作线程中的插槽传递数据的信号。我已经确认我的数据备份作业是可重入的,所以我需要做的就是确保工作线程在它们自己的这些类的实例上工作。此外,通过调用QObject子类方法完成的数据传输在工作线程启动之前完成 - 是否可以防止竞争条件并且安全吗?
此外,根据“访问其他线程的QObject的子类”一节here它看起来有点危险在QObject的子类使用插槽...
确定这里是我最近忙的代码... 编辑随着代码:
void Replicator::advancedAllBackup()
{
updateStatus("<font color = \"green\">Starting All Advanced Backups</font>");
startBackup();
worker = new Worker;
worker->moveToThread(workerThread);
setupWorker(normal);
QList<BackupJob> jobList;
for (int backupCount = 0; backupCount < advancedJobs.size(); backupCount++)
jobList << advancedJobs[backupCount];
worker->setData(jobList);
workerThread->start();
}
的STARTBACKUP功能设置一些布尔和更新GUI。设置工作程序函数连接工作线程和工作对象的所有信号和插槽。 setData函数将工作器作业列表数据设置为后端数据,并在线程启动之前调用,因此没有并发性。 然后我们开始线程并完成它的工作。
而这里的工人代码:
void setData(QList<BackupJob> jobs) { this->jobs = jobs; }
所以我的问题是:这是安全的?
“通过调用QObject子类方法完成的数据传输是在工作线程启动之前完成的 - 这是否会阻止竞争条件并且安全?”这里的'QObject'没有关系。重要的是,如果实施你的方法,实际上你的整个班级都是安全的。您如何期望我们能够决定在没有您提供任何代码供我们谈论的情况下? –
“在QObject子类中使用插槽看起来有点危险......“这是一个无用的观察(你实际上不能使用它),一个特定的方法,无论是否是槽,都是线程安全的或不是线程安全的,如果它不是线程安全的,那么它只能从你应该声明它是这样调用的:在这些方法的开头添加'Q_ASSERT(QThead :: currentThread()== thread());'可以从任何线程调用线程安全的方法。一个线程不安全的方法安全地调用发送一个信号并将该方法连接到它 –