2012-10-24 2 views
1

메인 애플리케이션의 스레드에 데이터를 전달하는 방법은 무엇입니까?데이터 (구조)를 스레드로 메시지로 전달하는 방법.

주 응용 프로그램에서 오류 메시지 처리를위한 스레드를 만들었습니다. 주 응용 프로그램에서 오류가있는 경우 데이터를 처리하는 동안 오류 메시지가 생성되어 구조에 채워집니다. 이 오류 메시지 (구조)를 스레드로 전달해야 스레드가 스레드를 처리하고 주 응용 프로그램이 계속 작업해야합니다. Windows 플랫폼에서 C에서이 작업을 수행하려고합니다.

내 응용 프로그램에는 스레드가 하나만 실행됩니다. 지금은 전역 변수 구조 (myData)를 정의했으며이를 전달하는 데 PostThreadMessage를 사용했습니다. 주요 응용 프로그램에서

struct myData errorData; 

내가 그것을 잘 작동되는 순간

MsgReturn = GetMessage(&msg, NULL, THRD_MESSAGE_SOMEWORK, THRD_MESSAGE_EXIT); 

이 스레드에서

PostThreadMessage(ErrorLogId, THRD_MESSAGE_EXIT , 0 , (LPARAM)&errorData); 

를 사용하여 메시지를 게시 할 수 있습니다. 그러나 오류 메시지 처리에 시간이 더 걸리는 경우, 메인 애플리케이션은 새로운 오류를 가져오고 글로벌 구조체 인 errorData에서 데이터를 업데이트 할 수 있습니다.

잠금 메커니즘을 사용할 수는 있지만 스레드가 처리를 마칠 때까지 주 응용 프로그램을 중단 할 수 없습니다. 데이터를 전역 변수로 사용하지 않고 데이터를 전달하는 방법은 무엇입니까?

답변

1

해결 방법은 매번 struct myData (malloc() 사용)을 동적으로 할당하고 채우고 처리를 위해 스레드로 전달하는 것입니다. 스레드가 처리를 완료하면 스레드가 책임을집니다.

이 방법은 전역 개체 errorData (더 이상 필요하지 않음)의 스레드 간 동기화를 제거합니다.

0

편집 :

메시지 큐 죄송합니다, 그럼 동적으로 할당 된 메시지는 물론 할 것, 이미 몰랐어요.

참조 올드 대답 : 당신이 스레드가 오류 메시지 처리를 완료 할 때까지 기다려야하지 않으려면

는, 당신은 메인 스레드와 작업자 사이의 통신을 위해 동기화 큐를 사용한다 실.

작업자 스레드 : 이것은 무슨 뜻인지 설명하는 일부 의사 코드

while (queue_is_empty()) 
    wait; 
lock(queue); 
process_error(read(queue)); 
unlock(queue); 

메인 스레드 : 당신은 처음부터 그것을 구현하지 않아도

if (error) 
    lock(queue) 
    write(queue, error) 
    unlock(queue) 
    //possibly signal thread 

, 당신은 비슷한 것을 사용할 수 있습니다 RabbitMQ

2

PostThreadMessage()에 전화 할 때마다 struct myData의 새 인스턴스가 생성됩니다.

free()이 스레드는 struct myData이 필요합니다.

현재 접근 방식에 동기화를 추가하는 것은 주 작업을 계속하는 동안 작업자를 생성하는 비동기 개념에 위배됩니다.

어쨌든 스레드는 공유 로그 파일에 무언가를 쓰는 경우에도 여전히 동기화를 사용해야합니다.

1

오류 메시지를 동적으로 할당하고 (malloc()) 어떻게 채우고 포인터를 메시지의 스레드에 전달합니까? 그런 다음 스레드가 메시지에 대해 작업하고 할당을 해제합니다 (free()).

관련 문제