C++: Dll, разгружающий проблему

Если вы не хотите зависеть от каких-либо сторонних зависимостей и не хотите выполнять фильтрацию регулярных выражений,

Вы можете сделать это в одну строку с API потоков Java 8:

Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();
[115 ] Для подробной многострочной версии предыдущего:

Arrays.stream(sb.toString()
    .trim() // Trim the starting and ending whitespaces from string
    .split(" ")) // Split the regarding to spaces
    .filter(s-> !s.equals("")) // Filter the non-empty elements from the stream
    .map(s -> s.trim()) // Trim the starting and ending whitespaces from element
    .toArray(); // Collect the elements to object array

Вот рабочий код для демонстрации:

StringBuilder sb = new StringBuilder(" 111     11 ");
Object[] array = Arrays.stream(sb.toString().trim().split(" ")).filter(s-> !s.equals("")).map(s -> s.trim()).toArray();

System.out.println("(" + array[0] + ")");
System.out.println("(" + array[1] + ")");
5
задан Fire Lancer 20 January 2009 в 10:57
поделиться

4 ответа

Принятие Вас не хочет завершать поток при разгрузке библиотеки (иначе, см. MSalters), необходимо освободить библиотеку от вызывающей стороны, которая загрузила его.

COM решает это счетчиком экземпляра в DLL (во многом как Ваш, если я понимаю Вас правильно), и regulary проверка его путем называния глобального экспортируемым CanUnloadNow функция.

Другая опция состоит в том, чтобы иметь Ваши объектные/интерфейсные интеллектуальные указатели, ТАКЖЕ ссылаются на DLL, из которого они произошли. Это увеличило бы размер клиентских данных, но Вы не должны будете касаться DLL. Вы могли бы даже переработать ссылочный счетчик LoadLibrary/FreeLibrary, однако который мог бы поразить производительность.

Кроме того, ни одна из этих схем не помогает многому, если Вы получаете круговые зависимости DLL (ссылки DllA.X Компонента DllB.Y, который ссылки DllA.Z). Я еще не загрязнил хорошее решение того, что doesn#t требуют глобального знания.

6
ответ дан 14 December 2019 в 09:02
поделиться

MSDN является явным по этой теме: "Поток, который должен разгрузить DLL, в котором он выполняется и затем завершает себя, должен назвать FreeLibraryAndExitThread вместо того, чтобы назвать FreeLibrary и ExitThread отдельно. Иначе состояние состязания может произойти. Для получения дополнительной информации посмотрите раздел Remarks FreeLibraryAndExitThread.

0
ответ дан 14 December 2019 в 09:02
поделиться

Для случая, где DLL переключается во время выполнения, я избежал бы системы интеллектуального указателя для объектов, созданных DLL, и использовал бы систему как это:

                    |-----------------------|  |--------------------------|
                    | Abstraction Interface |  | Implementation Interface |
                    |-----------------------|  |--------------------------|
                               ^                           ^
                               |                           |
|-------------|1     *|-------------------|*      *|----------------|
| Application |-------| Abstraction Layer |--------| Implementation |
|-------------|       |-------------------|        |----------------|

\------------- Main Program ------------------/ \-------- DLL --------/

Приложение содержит список всех выделенных объектов уровня абстракции. Объекты уровня абстракции являются единственными объектами, которым позволяют владеть указателями на объекты, созданные слоем реализации. При свопинге DLLs сначала выполните итерации всех объектов уровня абстракции и скажите им выпускать реализацию определенные данные. Затем разгрузите DLL и загрузите новый DLL. Затем выполните итерации объектов уровня абстракции снова и скажите им создавать новую реализацию определенные данные.

1
ответ дан 14 December 2019 в 09:02
поделиться

Хорошо я думаю, что лучший выбор состоит в том, чтобы использовать подход COM опроса dll, чтобы видеть, может ли он быть разгружен. Как я могу пойти о выполнении этого хотя так, чтобы я мог продолжить опрашивать dll после того, как все остальное закрылось (т.е. основной поток завершился)? Я должен создать completly отдельный процесс, чтобы сделать это, в этом случае как я делаю это так, этот отдельный процесс знает обо всем загруженном dlls, и способом который оказывает Очень мало влияния на proformance?

Mayby я мог просто создать систему опроса, когда все DllPtr вне объема и завершают его, как только он имеет свободный dll? Тем путем это только существует столько, сколько это берет, чтобы были уничтожены любые remaing интеллектуальные указатели.

0
ответ дан 14 December 2019 в 09:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: