Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / С вызовом external функции из потока какие-то непонятки / 25 сообщений из 34, страница 1 из 2
03.10.2018, 19:20
    #39712639
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Есть приложение со своим API, реализованным через dll.
В API есть функция с PChar параметром, возвращающая 0 если все нормально и -1 если нет.
Если я вызываю эту функцию из основного потока, проблем нет. Могу вызвать сколько угодно раз. Но мне захотелось фкусняшек.

Создаю кучу потоков, которые в критической секции (ждут друг друга) вызывают эту функцию. При вызове из первого потока все происходит нормально. Чужая прога делает свое дело, функция возвращает 0. При вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1. После всех телодвижений закрываю свое приложение, получаю:

Код: plaintext
1.
2.
3.
4.
5.
6.
---------------------------
Error
---------------------------
Runtime error 217 at 00009D54
---------------------------
ОК   
---------------------------

В дебагере получаю:

Код: plaintext
1.
2.
3.
First chance exception at $7720C41F.
Exception class EWin32Error with message 'Win32 Error.
Code: 1400.
Недопустимый дескриптор окна'. Process BfromP.exe (19020)

Смотрю в дебагере список потоков, они самоудаляются в положенное время. Если убираю из кода работу с чужой прогой и ставлю Sleep(2000), все нормально. Проблем нет.

Куда копать?
...
Рейтинг: 0 / 0
03.10.2018, 20:06
    #39712663
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeКуда копать?

Букварь на предмет работы с памятью. Выделение, использование, освобождение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.10.2018, 21:09
    #39712680
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра...
...
Рейтинг: 0 / 0
03.10.2018, 21:23
    #39712683
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра...
Ну, если только по одной шт., то можно память как хочешь крутить, конечно.
...
Рейтинг: 0 / 0
03.10.2018, 21:37
    #39712689
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Dimitry Sibiryakov,
Котовасия,

Вы хотите сказать, что что-то накрутил до работы с API, а всплыло как раз сейчас?
...
Рейтинг: 0 / 0
03.10.2018, 21:58
    #39712694
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-home,

Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией?
...
Рейтинг: 0 / 0
03.10.2018, 22:07
    #39712698
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.10.2018, 22:14
    #39712699
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
_Vasilisk_Flying-home,

Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией?
До этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду.
Все вызовы, о которых я писал выше, вызываются в одной критической секции, по одному вызову на поток.
...
Рейтинг: 0 / 0
03.10.2018, 22:32
    #39712706
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Dimitry SibiryakovFlying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?
Кажется, понял.
...
Рейтинг: 0 / 0
03.10.2018, 22:59
    #39712719
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Dimitry SibiryakovFlying-homeТак я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?
По порядку: он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического массива. На момент вызова внешней функции вся работа с массивом закончена, из него осуществляется только чтение. И я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения.
...
Рейтинг: 0 / 0
03.10.2018, 23:02
    #39712720
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Ладно, завтра продолжим.
...
Рейтинг: 0 / 0
04.10.2018, 00:18
    #39712737
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeон указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического
массива. На момент вызова внешней функции вся работа с массивом закончена, из него
осуществляется только чтение.

А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как
работа с ними закончена?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.10.2018, 01:55
    #39712742
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
авторпри вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1

вот это очень интересный момент. Независимо от работы с PChar.
...
Рейтинг: 0 / 0
04.10.2018, 02:01
    #39712743
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
P.S.
может там в DLL из-за многопоточой работы с общими для всех потоков глобальными переменными нестыкковки вышли? Ну DLL же один раз же загружается, а не своя в каждый поток.
...
Рейтинг: 0 / 0
04.10.2018, 03:10
    #39712747
MinGW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
А чего чужая DLL хоть делает-то?
Flying-homeПри вызове из первого потока все происходит нормально.
При вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1.Дак может тупо из-за CoInitializeEx()?
Создайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код , только в потоке .
Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx().
Flying-homeДо этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду.Как так вы не знаете что за функция и зачем она и нужно ли вызвать? Документация что говорит?
Смотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе... А может она как раз CoInitializeEx() и делает?
Flying-homeИ я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения.Надо не "надеяться", а искать точные сведения в документации по той DLL.
...
Рейтинг: 0 / 0
04.10.2018, 07:49
    #39712769
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Dimitry SibiryakovFlying-homeон указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического
массива. На момент вызова внешней функции вся работа с массивом закончена, из него
осуществляется только чтение.

А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как
работа с ними закончена?..
Да. Тут все нормально.
...
Рейтинг: 0 / 0
04.10.2018, 07:57
    #39712771
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
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Смотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе..
Пробовал. Без изменений.
...
Рейтинг: 0 / 0
04.10.2018, 08:51
    #39712786
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeMinGWСоздайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код , только в потоке .
Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx().
Да, сейчас сделаю.
Никаких проблем. Вторая кнопка работает по нескольку раз.
...
Рейтинг: 0 / 0
04.10.2018, 10:20
    #39712825
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
В основном проекте сделал отдельные кнопки для запуска потоков не в цикле. Все нормально. Они ставятся в очередь и отрабатывают без ошибок. А когда я их создаю в цикле, получается фигня.
...
Рейтинг: 0 / 0
04.10.2018, 10:21
    #39712827
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeА когда я их создаю в цикле, получается фигня.
Главное никому не показывать код. Тут же почти все экстрасенсы.
...
Рейтинг: 0 / 0
04.10.2018, 11:28
    #39712882
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-homeкогда я их создаю в цикле, получается фигня.
О! Дело не в цикле, а в том, откуда я делаю первый вызов. Если первый вызов делать из основного потока, то все нормально. Остальные вызовы делаются из потоков как положено, ошибок при закрытии программы нет.

Напрашивается логичный вопрос. Чтозафигня?
...
Рейтинг: 0 / 0
04.10.2018, 11:29
    #39712884
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
wadmanFlying-homeА когда я их создаю в цикле, получается фигня.
Главное никому не показывать код. Тут же почти все экстрасенсы.
Пока непонятно, какую часть кода показывать.
...
Рейтинг: 0 / 0
04.10.2018, 12:46
    #39712943
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-home,

стоит сделать минимальный кусок, воспроизводящий проблему. а там или сам разберешься, или нам покажешь.
...
Рейтинг: 0 / 0
04.10.2018, 13:10
    #39712960
Flying-home
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Так в процессе дискуссии анамнез изменился.
Проблема в том, что если первый вызов external функции делается не из главного потока приложения, то остальные вызовы приводят к ошибкам. Такое впечатление, что dll-ка при первом вызове запоминает какой-то атрибут потока, ее вызвавшего, и в дальнейшем пытается с ним взаимодействовать. А потока уже давно нет. Может, она пытается получить хэндл главного окна и по каким-то причинам не может этого сделать, поскольку вызов был из дополнительного потока.

Может, MinGW что-то подскажет.
...
Рейтинг: 0 / 0
04.10.2018, 13:37
    #39712982
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
С вызовом external функции из потока какие-то непонятки
Flying-home,

Окно оно создает. Глобальное невидимое. А потом шлет сообщения этому окну. Т.к. цикл обработки сообщений есть только в главном потоке, вот оно и работает.

Проверить теорию можно любой утилитой, которая показывает окна процесса. Например, Spy++
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / С вызовом external функции из потока какие-то непонятки / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]