|
|
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Есть приложение со своим API, реализованным через dll. В API есть функция с PChar параметром, возвращающая 0 если все нормально и -1 если нет. Если я вызываю эту функцию из основного потока, проблем нет. Могу вызвать сколько угодно раз. Но мне захотелось фкусняшек. Создаю кучу потоков, которые в критической секции (ждут друг друга) вызывают эту функцию. При вызове из первого потока все происходит нормально. Чужая прога делает свое дело, функция возвращает 0. При вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1. После всех телодвижений закрываю свое приложение, получаю: Код: plaintext 1. 2. 3. 4. 5. 6. В дебагере получаю: Код: plaintext 1. 2. 3. Смотрю в дебагере список потоков, они самоудаляются в положенное время. Если убираю из кода работу с чужой прогой и ставлю Sleep(2000), все нормально. Проблем нет. Куда копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 19:20 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeКуда копать? Букварь на предмет работы с памятью. Выделение, использование, освобождение. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 20:06 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 21:09 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра... Ну, если только по одной шт., то можно память как хочешь крутить, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 21:23 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Котовасия, Вы хотите сказать, что что-то накрутил до работы с API, а всплыло как раз сейчас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 21:37 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-home, Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 21:58 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра... О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 22:07 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Flying-home, Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией? До этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду. Все вызовы, о которых я писал выше, вызываются в одной критической секции, по одному вызову на поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 22:14 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFlying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра... О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает? Кажется, понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 22:32 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFlying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра... О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает? По порядку: он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического массива. На момент вызова внешней функции вся работа с массивом закончена, из него осуществляется только чтение. И я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 22:59 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Ладно, завтра продолжим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2018, 23:02 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeон указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического массива. На момент вызова внешней функции вся работа с массивом закончена, из него осуществляется только чтение. А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как работа с ними закончена?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 00:18 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
авторпри вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1 вот это очень интересный момент. Независимо от работы с PChar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 01:55 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
P.S. может там в DLL из-за многопоточой работы с общими для всех потоков глобальными переменными нестыкковки вышли? Ну DLL же один раз же загружается, а не своя в каждый поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 02:01 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
А чего чужая DLL хоть делает-то? Flying-homeПри вызове из первого потока все происходит нормально. При вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1.Дак может тупо из-за CoInitializeEx()? Создайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код , только в потоке . Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx(). Flying-homeДо этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду.Как так вы не знаете что за функция и зачем она и нужно ли вызвать? Документация что говорит? Смотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе... А может она как раз CoInitializeEx() и делает? Flying-homeИ я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения.Надо не "надеяться", а искать точные сведения в документации по той DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 03:10 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFlying-homeон указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического массива. На момент вызова внешней функции вся работа с массивом закончена, из него осуществляется только чтение. А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как работа с ними закончена?.. Да. Тут все нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 07:49 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
MinGWА чего чужая DLL хоть делает-то? Она заставляет ту, чужую прогу открыть файл. Файл большой и открывается долго. MinGWСоздайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код , только в потоке . Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx(). Да, сейчас сделаю. MinGWКак так вы не знаете что за функция и зачем она и нужно ли вызвать? Документация что говорит?docsCheck if OziExplorer is running function oziFindOzi:integer;stdcall; If OziExplorer is running the function returns 0 otherwise it returns -1 MinGWСмотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе.. Пробовал. Без изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 07:57 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeMinGWСоздайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код , только в потоке . Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx(). Да, сейчас сделаю. Никаких проблем. Вторая кнопка работает по нескольку раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 08:51 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
В основном проекте сделал отдельные кнопки для запуска потоков не в цикле. Все нормально. Они ставятся в очередь и отрабатывают без ошибок. А когда я их создаю в цикле, получается фигня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 10:20 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeА когда я их создаю в цикле, получается фигня. Главное никому не показывать код. Тут же почти все экстрасенсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 10:21 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-homeкогда я их создаю в цикле, получается фигня. О! Дело не в цикле, а в том, откуда я делаю первый вызов. Если первый вызов делать из основного потока, то все нормально. Остальные вызовы делаются из потоков как положено, ошибок при закрытии программы нет. Напрашивается логичный вопрос. Чтозафигня? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 11:28 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
wadmanFlying-homeА когда я их создаю в цикле, получается фигня. Главное никому не показывать код. Тут же почти все экстрасенсы. Пока непонятно, какую часть кода показывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 11:29 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-home, стоит сделать минимальный кусок, воспроизводящий проблему. а там или сам разберешься, или нам покажешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 12:46 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Так в процессе дискуссии анамнез изменился. Проблема в том, что если первый вызов external функции делается не из главного потока приложения, то остальные вызовы приводят к ошибкам. Такое впечатление, что dll-ка при первом вызове запоминает какой-то атрибут потока, ее вызвавшего, и в дальнейшем пытается с ним взаимодействовать. А потока уже давно нет. Может, она пытается получить хэндл главного окна и по каким-то причинам не может этого сделать, поскольку вызов был из дополнительного потока. Может, MinGW что-то подскажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 13:10 |
|
||
|
С вызовом external функции из потока какие-то непонятки
|
|||
|---|---|---|---|
|
#18+
Flying-home, Окно оно создает. Глобальное невидимое. А потом шлет сообщения этому окну. Т.к. цикл обработки сообщений есть только в главном потоке, вот оно и работает. Проверить теорию можно любой утилитой, которая показывает окна процесса. Например, Spy++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2018, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39712771&tid=2040319]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 421ms |

| 0 / 0 |
