2010-04-14 3 views
2

Qt가 새로 도입되었습니다. 문제 해결을 도와주세요.신호 및 슬롯을 사용하여 포인터 업데이트

스레드를 사용하여 백그라운드에서 집중적 인 작업을 수행하고 있습니다. 그 사이에 나는 UI를 업데이트하려고합니다. 그래서 나는 신호와 슬롯을 사용하고 있습니다. UI를 업데이트하기 위해 신호를 내고 UI를 업데이트합니다. 우리가 샘플 코드 아래 생각해 보자

,

struct sample 
{ 
    QString name; 
    QString address; 
}; 

void Update(sample *); 

void sampleFunction() 
{ 
    sample a; 
    a.name = "Sachin Tendulkar"; 
    a.address = "India" 
    emit Update(&a); 
} 

는 위의 코드에서 우리는 로컬 객체를 생성하고 로컬 객체의 주소를 전달한다. Qt 문서에서 우리는 신호를 방출 할 때 신호를 대기열에 배치하고 늦게 신호를 창에 전달할 것이라고 말합니다. 내 개체가 로컬 범위에 있기 때문에 범위를 벗어나면 삭제됩니다.

신호에 포인터를 보내는 방법이 있습니까?

+1

모든 신호 슬롯 연결은 기본적으로 (즉, 슬롯은 방출 내에서 동 기적으로 호출됩니다.) 따라서 로컬 변수에 포인터를 전달할 수 있습니다. MSalters가 권장하는 것처럼 가치에 따라 구조를 전달하는 것이 훨씬 더 좋은 해결책입니다. – chalup

+0

재생 해 주셔서 감사합니다. 동기식이라면 아무 문제 없습니다. 나는 그대로 사용하겠습니다. 필자가 작성한 애플리케이션 구조가 너무 복잡합니다. –

답변

5

잘못된 일을 주장하는 이유는 무엇입니까?

+0

일반적으로 구조체를 값으로 전달하는 것은 큰 팬이 아닙니다. 특히 구조체가 크거나 부 풀기 쉬운 경우에 그렇습니다. 그러나이 경우에 당신이 옳다면, 가치에 의해 지나가는 것이 더 좋은 방법 일 수 있습니다. QString의 크기는 얼마입니까? –

+0

직접적인 복사 도구의 비용은 스레드 간 신호의 비용으로 훨씬 초과 될 것이며 GUI 업데이트에 의해 그 비용이 훨씬 초과됩니다. 그래서,이 사본은별로 중요하지 않습니다. – MSalters

+0

QString 구현은 ref-counting COW 문자열이므로 전달하기에 매우 효율적입니다. –

4

이 코드가 성능 병목 현상이라고 판단한 경우가 아니라 포인터 대신 개체의 복사본을 전달하는 것이 좋습니다.

정말 그렇습니다.

그러나 포인터를 사용해야하는 경우 boost :: shared_ptr을 사용하면 자체가 삭제됩니다.

void Update(boost::shared_ptr<sample> s); 

void sampleFunction() 
{ 
    boost::shared_ptr<sample> a = boost::shared_ptr<sample>(new sample()); 
    a->name = "Sachin Tendulkar"; 
    a->address = "India" 
    emit Update(a);  
} 
+0

을 사용할 수 없습니다. 포인터에 연산자. 당신은 a-> name과 a-> address를 말하려고했습니다. 그냥 하나의 선택 ;-) –

+0

슬롯에서 인수를 삭제하는 것은 나쁜 생각입니다. 왜냐하면 하나 이상의 슬롯에 신호를 연결하면 segfault가 생기기 때문입니다. Sample을 값으로 보내면 조기 최적화가되고 메모리 관리에 불필요한 복잡성이 추가됩니다. – chalup

+0

동의 함. 천천히 삭제하는 것은 나쁘다. 업데이트 된 답변 shared_ptr ...하지만 여전히, 정말로, 단지 값으로 전달하고 자신을 고통을 저장 :) –

관련 문제