我有一个类的层次结构:
struct A
和struct B
,存储在A的实例中。
我运行A的方法,它运行B的方法,下载与下载到B的插槽的连接信号异步的东西。
之后我不会使用A和B实例。它们保存在矢量中。
我需要的是从对象B获取有关下载完成的信息(来自B的方法运行方法A以通知它并将其数据保存到A)。通知后,不再需要B的实例(它存储了大量数据,所以我需要清除它)。但没有其他线程知道什么时候应该完成!
由于delete this
的危险,调用插槽B的线程无法清除B对象。即使该线程设置了一些互斥锁(可以放置在A中),另一个等待所有时间到该互斥锁的线程也将删除它 - 这也很危险,因为插槽的线程仍然可以运行。
那么,如何在B通知的插槽中安全地删除B实例?
我尝试在这里创建代码示例(B - 下载程序,A - 存储):
struct Storage
{
Downloader *d; // createrd in ctor
Data data; // only value, not pointer (for some reasons).
//The same in 'Downloader'
int downloadedFiles; // 0 by ctor
void run() // think, main()
{
d->download(); // there is an array in my program.
//Here is one Downloader*, because it is example
}
void finishedDownload()
{
++downloadedFiles;
data = a->data;
// delete d; // wish, it would be done like that :(
// But the thread will be back to a->download()
}
}
struct Downloader
{
Data data;
Internet internet;
Storage *parent;
void download()
{
internet.set('http://someurl.dat');
connect( &internet, SIGNAL(downloaded()), this, SLOT(downloaded()) );
internet.download(&data); // async
}
public slots :
void downloaded()
{
parent->finishedDownload();
// And there is the finish of the thread, which was created by SIGNAL of Interget,
//but I need to delete 'Data data' from this struct.. How?
}
};
答案 0 :(得分:1)
由于它标记为qt,请使用this->deleteLater()
代替delete this