powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / С вызовом external функции из потока какие-то непонятки
25 сообщений из 34, страница 1 из 2
С вызовом external функции из потока какие-то непонятки
    #39712639
Фотография Flying-home
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение со своим 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
С вызовом external функции из потока какие-то непонятки
    #39712663
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flying-homeКуда копать?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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