Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Есть приложение со своим API, реализованным через dll.
В API есть функция с PChar параметром, возвращающая 0 если все нормально и -1 если нет.
Если я вызываю эту функцию из основного потока, проблем нет. Могу вызвать сколько угодно раз. Но мне захотелось фкусняшек.

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

---------------------------
Error
---------------------------
Runtime error 217 at 00009D54
---------------------------
ОК
---------------------------

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

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

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

Куда копать?
3 окт 18, 19:20    [21694510]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46451

Flying-home
Куда копать?

Букварь на предмет работы с памятью. Выделение, использование, освобождение.

Posted via ActualForum NNTP Server 1.5

3 окт 18, 20:06    [21694541]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра...
3 окт 18, 21:09    [21694585]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Flying-home
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один пичар для параметра...

Ну, если только по одной шт., то можно память как хочешь крутить, конечно.
3 окт 18, 21:23    [21694598]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Dimitry Sibiryakov,
Котовасия,

Вы хотите сказать, что что-то накрутил до работы с API, а всплыло как раз сейчас?
3 окт 18, 21:37    [21694612]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10652
Flying-home,

Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией?
3 окт 18, 21:58    [21694622]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46451

Flying-home
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?

Posted via ActualForum NNTP Server 1.5

3 окт 18, 22:07    [21694627]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
_Vasilisk_
Flying-home,

Из dll вызывается только одна эта функция? И все ее вызовы закрыты одной критической секцией?

До этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду.
Все вызовы, о которых я писал выше, вызываются в одной критической секции, по одному вызову на поток.
3 окт 18, 22:14    [21694633]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Dimitry Sibiryakov
Flying-home
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?

Кажется, понял.
3 окт 18, 22:32    [21694646]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Dimitry Sibiryakov
Flying-home
Так я под работу с этим API выделяю одну целочисленную переменную для результата и один
пичар для параметра...

О-о-о... Целый пичар выделяешь... А на куда этот пичар указывает?

По порядку: он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического массива. На момент вызова внешней функции вся работа с массивом закончена, из него осуществляется только чтение. И я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения.
3 окт 18, 22:59    [21694667]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Ладно, завтра продолжим.
3 окт 18, 23:02    [21694669]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46451

Flying-home
он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического
массива. На момент вызова внешней функции вся работа с массивом закончена, из него
осуществляется только чтение.

А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как
работа с ними закончена?..

Posted via ActualForum NNTP Server 1.5

4 окт 18, 00:18    [21694707]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6281
автор
при вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1


вот это очень интересный момент. Независимо от работы с PChar.
4 окт 18, 01:55    [21694724]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6281
P.S.
может там в DLL из-за многопоточой работы с общими для всех потоков глобальными переменными нестыкковки вышли? Ну DLL же один раз же загружается, а не своя в каждый поток.
4 окт 18, 02:01    [21694725]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
MinGW
Member

Откуда:
Сообщений: 11
А чего чужая DLL хоть делает-то?
Flying-home
При вызове из первого потока все происходит нормально.
При вызове из остальных потоков (когда дождутся своей очереди) прога тоже делает свое дело, но возвращает -1.
Дак может тупо из-за CoInitializeEx()?
Создайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код, только в потоке.
Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx().
Flying-home
До этого вызывается еще одна функция типа "ты тут?" без параметров. Ее можно вообще не вызывать, можно вызывать хоть раз в секунду.
Как так вы не знаете что за функция и зачем она и нужно ли вызвать? Документация что говорит?
Смотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе... А может она как раз CoInitializeEx() и делает?
Flying-home
И я надеюсь, что разработчик API ничего не делает с участком памяти, указатель на который я ему передал для чтения.
Надо не "надеяться", а искать точные сведения в документации по той DLL.
4 окт 18, 03:10    [21694730]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Dimitry Sibiryakov
Flying-home
он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического
массива. На момент вызова внешней функции вся работа с массивом закончена, из него
осуществляется только чтение.

А ты в курсе, что динамические массивы и строки автоматически освобождаются после того как
работа с ними закончена?..

Да. Тут все нормально.
4 окт 18, 07:49    [21694763]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
MinGW
А чего чужая DLL хоть делает-то?

Она заставляет ту, чужую прогу открыть файл. Файл большой и открывается долго.
MinGW
Создайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код, только в потоке.
Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx().

Да, сейчас сделаю.
MinGW
Как так вы не знаете что за функция и зачем она и нужно ли вызвать? Документация что говорит?
docs
Check if OziExplorer is running

function oziFindOzi:integer;stdcall;

If OziExplorer is running the function returns 0 otherwise it returns -1

MinGW
Смотрим, заработает ли вторая кнопка с предварительным вызовом этой "неизвестной" (из потока же). хе-хе..

Пробовал. Без изменений.
4 окт 18, 07:57    [21694766]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Flying-home
MinGW
Создайте новый пустой проект, две кнопки - при нажатии одной вызывается функция в основном потоке, при нажатии другой - тот же код, только в потоке.
Если вторая не фурычит - смотрим что будет если добавить CoInitializeEx().

Да, сейчас сделаю.

Никаких проблем. Вторая кнопка работает по нескольку раз.
4 окт 18, 08:51    [21694795]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
В основном проекте сделал отдельные кнопки для запуска потоков не в цикле. Все нормально. Они ставятся в очередь и отрабатывают без ошибок. А когда я их создаю в цикле, получается фигня.
4 окт 18, 10:20    [21694861]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24628
Flying-home
А когда я их создаю в цикле, получается фигня.

Главное никому не показывать код. Тут же почти все экстрасенсы.
4 окт 18, 10:21    [21694863]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Flying-home
когда я их создаю в цикле, получается фигня.

О! Дело не в цикле, а в том, откуда я делаю первый вызов. Если первый вызов делать из основного потока, то все нормально. Остальные вызовы делаются из потоков как положено, ошибок при закрытии программы нет.

Напрашивается логичный вопрос. Чтозафигня?
4 окт 18, 11:28    [21694960]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
wadman
Flying-home
А когда я их создаю в цикле, получается фигня.

Главное никому не показывать код. Тут же почти все экстрасенсы.

Пока непонятно, какую часть кода показывать.
4 окт 18, 11:29    [21694962]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2972
Flying-home,

стоит сделать минимальный кусок, воспроизводящий проблему. а там или сам разберешься, или нам покажешь.
4 окт 18, 12:46    [21695086]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14068
Так в процессе дискуссии анамнез изменился.
Проблема в том, что если первый вызов external функции делается не из главного потока приложения, то остальные вызовы приводят к ошибкам. Такое впечатление, что dll-ка при первом вызове запоминает какой-то атрибут потока, ее вызвавшего, и в дальнейшем пытается с ним взаимодействовать. А потока уже давно нет. Может, она пытается получить хэндл главного окна и по каким-то причинам не может этого сделать, поскольку вызов был из дополнительного потока.

Может, MinGW что-то подскажет.
4 окт 18, 13:10    [21695119]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10652
Flying-home,

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

Проверить теорию можно любой утилитой, которая показывает окна процесса. Например, Spy++
4 окт 18, 13:37    [21695161]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить