假設有一個帶有信號的 qt 物件。這個物件發出一個信號,其中包含一些分配在堆上的物件(新的/malloc)。事件的解構式釋放所有分配的資料。如果沒有連接到qt-object信號,這些資料會以任何方式發布嗎?如果偵聽器在其信號槽中接收到事件之前關閉連接?
補充:
縮短示例。
class MyEvent { virtual ~MyEvent(); }; // root class for all my project events
class MyEventQueue {
MyEventQueue(); // initialize mutex
virtual ~MyEventQueue(); // delete and release all events from events_
void push_back( MyEvent *); // atomic-push event
MyEvent *pop_front(); // atomic-pop event
pthread_mutex_t sync_; // mutex for atomic operations
std::queue<MyEvent *> events_; // queue of events
};
class MyEvent1 : public MyEvent {
MyEvent1( char *);
~MyEvent1() { delete[] data; }
char *data;
};
class MyWriter {
...;
void eval();
signals: void send1( MyEventQueue *);
MyEventQueue queue_;
};
class MyReader {
...;
slots: void recv1( MyEventQueue *);
};
class MyController {
...;
}
MyWriter 和 MyReader 是在一個行程的不同執行緒中作業的獨立參與者。
void MyWriter::eval() {
...;
queue_.push_back( new MyEvent1( ...));
emit send1( &queue_);
}
void MyReader::recv1( MyEventQueue *queue) {
if ( MyEvent *event = queue->pop_front() ) {
// event is delivered to MyReader
...;
delete event;
}
}
如果發送的事件被傳遞并被接受,它將在 MyReader 中被洗掉。以其他方式,事件將保存在 MyWriter::queue_ 中。
MyController 充當 MyWriter 和 MyReader 的調度程式/管理器。它還實作了與其他功能塊的通信。在(外部)資料處理周期結束時,MyController 停止 MyWriter、MyReader(它們的執行緒等它們的 qt 事件回圈)。然后關閉 MyWriter 和 MyReader 之間的連接。如果某些事件由 MyWriter 發送,但未被 MyReader 接受,則分配的資料將在 ~MyWriter() -> queue_ 的解構式中釋放。
(對于多個讀者,我在 MyController 中使用顯式重新發送與事件處理或僅一對一連接,在這種情況下 MyController 用作具有自事件佇列的路由器。)
主要原因是資料處理的流水線化和并行化。
我懷疑我是否重復了 qt-engine 的作業。當然,可能還有更好的解決方案。
uj5u.com熱心網友回復:
關于傳遞給信號的引數的一般建議
銷毀作為信號引數傳遞的物件取決于您。請注意,多個槽可能會連接到同一個信號,這可能會導致多次破壞物件。
一些(常見)可能性是:
- 通過常量參考傳遞。當使用排隊連接時,Qt 將創建一個副本。否則,將不會進行復制。
- 按值傳遞。對基本型別有用,否則通過常量參考傳遞。
- 傳遞共享指標。
另一種選擇可能是檢查插槽是否連接到信號,使用QObject::isSignalConnected. 如果引數是資源密集型的構造,則此函式對于避免信號的發射特別有用。但是,我不建議在您的情況下使用此選項,因為它不能解決多個插槽連接到同一信號的情況。
另一種可能性是實作您自己的回呼方法,這將允許您強制執行唯一的回呼方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392575.html
