2011-11-07 9 views
4

보조 스레드를 사용하는 메소드를 호출했습니다. 메서드 내부에서 메인 스레드에서 메서드를 호출해야합니다. 주 스레드가 메시지를 수신 할 때이 기능을 실행하기 위해 어떻게 든 메시지를 게시 할 수있는 메시지 펌프를 실행하는 경우보조 스레드의 주 스레드를 사용하는 호출 방법

여기에 구조를

void main_thread_method() 
{ 

} 

void secondary_thread_method() 
{ 

//do something here 

    call main_thread_method() here using main thread 

} 

pthread thread1; 

pthread_create (&thread1, NULL, (void *) &secondary_thread_method, NULL); 

pthread_join(thread1); 
+0

동일한 프로세스의 다른 스레드에서 하나의 스레드의 데이터에 액세스 할 수 있으므로 문제가 무엇인지 알 수 없습니다 ? 일부 계산을 위해 다른 스레드로 컨트롤을 전송 하시겠습니까? 이 경우 세마포어와 조건 변수를 체크 아웃하십시오. –

+0

@All : Objective C/C++에는 보조 스레드의 주 스레드를 사용하여 메소드를 호출 할 수있는 API가 있습니다. 사실, 메인 스레드에서만 호출되어야하는 gtkWindow 객체를 호출해야합니다. – boom

답변

4

입니다.

그렇지 않으면 간단한 대기열 (물론 적절한 잠금)이 있어야합니다. main_thread_method가 호출 될 수 있도록 큐에 충분한 데이터를 추가하십시오. (args 등). 주 스레드의 새 메시지를 주기적으로 폴링하고 처리합니다.

+0

+1 폴링보다 나은 방법이 있지만 근본적으로 올바른 방법입니다. 기본적으로 메인 스레드는 그냥 앉아서 기다릴 수 없으며 적극적으로 어떻게 든 듣고 있어야합니다. –

+0

+1 메인 스레드 창에 대한 PostMessage. 일반적으로 시작시 RegisterClass() 및 CreateWindow()로 작성된 보이지 않는 창을 주 스레드의 모든 게시물에 사용합니다. wParam에서 대상 창 인스턴스를 전송하고 lParam에서 매개 변수를 전송합니다. 그런 다음 WndProc은 게시 된 메시지를 가져올 때 전달되는 모든 윈도우에서 메시지 처리기를 호출합니다. 'lParam'매개 변수는 무엇이든 상관 없으며 스위치를 통해 주 스레드에서 여러 가지 메서드를 호출 할 수있는 '명령'열거 형 (예 : 데이터 버퍼)을 포함하는 클래스를 전달합니다. –

+0

@Martin 내가 op가 리눅스 솔루션을 찾고 있다고 생각한다 –

1

주 스레드에서 실행해야하는 메서드를 보조 스레드에서 호출하고 싶다고 생각했습니다. 이건 불가능 해. 호출 된 함수는 동일한 스레드에서 실행됩니다. 세마포어, 메시지 풀링, 조건 등과 같은 멀티 스레딩 통신 방법을 사용하십시오.

관련 문제