나는이 일반적인 디자인, 리팩토링에 문제 또는 "선별"이 있습니다멀티 스레드 프로그램의 두 "깊은"부분을 서로 대화하는 패턴은 무엇입니까?
을 나는이 플러그인 라이브러리의 번호를 사용하여 데이터를 검색하는 기존 다중 스레드 C++ 응용 프로그램입니다. 현재 검색 인터페이스에서 주어진 플러그인은 검색 문자열과 QList 객체에 대한 포인터를받습니다. 다른 스레드에서 실행되는 플러그인은 나가서 다양한 데이터 원본 (로컬 및 웹)을 검색하고 해당 개체를 목록에 추가합니다. 플러그인이 돌아 오면 메인 프로그램은 여전히 별도의 스레드에 있으며이 데이터를 로컬 데이터 저장소에 추가 처리하여 뮤텍스를 사용하여이 삽입 포인터를 보호합니다. 따라서 각 플러그인은 비동기 적으로 데이터를 리턴 할 수 있습니다.
QT 기반 플러그인 라이브러리는 메시지 전달을 기반으로합니다. 상당수의 플러그인이 이미 응용 프로그램 용으로 작성되고 테스트되었으며 상당히 잘 작동합니다.
더 많은 플러그인을 작성하고 기존 응용 프로그램을 활용하고 싶습니다.
문제는 새로운 플러그인이 애플리케이션에서 더 많은 정보를 필요로한다는 것입니다. 검색 할 때 로컬 데이터 저장소 자체에 대한 간헐적 인 액세스가 필요합니다. 그래서 이것을 얻으려면 데이터를 저장하는 해시 배열과 저장소에 대한 다중 액세스를 보호하는 뮤텍스에 직접 또는 간접적으로 액세스해야합니다. "카탈로그"개체에 추가 메서드를 추가하여 액세스를 캡슐화한다고 가정합니다.
나는이 새로운 플러그인을 쓰는 세 가지 방법을 볼 수 있습니다. 플러그인을로드 할 때
- 는 시작 그들 내 "카탈로그"에 대한 포인터를 전달합니다. 새 플러그인에 대한 추가 정보, "보이지 않는"인터페이스가됩니다. 이것은 쉽고 빠르며, OO에 따르면 은 완전히 잘못되었지만 나는 미래의 문제가 무엇인지 알 수 없습니다. 나는 새로운 플러그인 라이브러리에 대한 를 호출 할 수있는 두 번째 기능을 가지고 있으므로
- 가 기존의 인터페이스 방법/메시지를 추가, 메시지가 에 플러그인에 대한 카탈로그를 포인터를 전달한다. 이 은 플러그인에 대해 쉽게 될 수 있지만 은 내 주 코드를 복잡하게 만들고 은 일반적으로 나쁨으로 보입니다.
플러그인 인터페이스를 다시 디자인하십시오. OO에 따르면 ""은 다른 부가적인 이점을 가질 수 있지만 은 " "의 모든 종류를 다시 작성해야합니다.
그래서, 내 질문은
A. 사람이 콘크리트 위험 내게 옵션 1의를 말할 수 있습니까?
B. 이러한 종류의 문제에 적합한 알려진 패턴이 있습니까?
EDIT1 : 그것은 반복을 통해 아웃 코드의
elsewhere(spec){
QList<CatItem> results;
plugins->getResult(spec, &results);
use_list(results);
}
...
void PluginHandler::getResults(QString* spec, QList<CatItem>* results)
{
if (id->count() == 0) return;
foreach(PluginInfo info, plugins) {
if (info.loaded)
info.obj->msg(MSG_GET_RESULTS, (void*) spec, (void*) results);
}
}
: 같은이
플러그인 루틴을 호출하기위한 일반적인 기능이 보인다. 나는 그것을 깰 때보 다 오히려 연장 할 것입니다.
단어는 강하지 만 정확합니다. –