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

Откуда: nas.vrostove.net
Сообщений: 14064
Есть приложение со своим 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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда: nas.vrostove.net
Сообщений: 14064
Так я под работу с этим 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
Сообщений: 14064
Dimitry Sibiryakov,
Котовасия,

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

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

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

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

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

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
Сообщений: 14064
Dimitry Sibiryakov
Flying-home
он указывает на начало Дельфистроки, в составе Дельфирекорда в составе динамического
массива. На момент вызова внешней функции вся работа с массивом закончена, из него
осуществляется только чтение.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверить теорию можно любой утилитой, которая показывает окна процесса. Например, Spy++
4 окт 18, 13:37    [21695161]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

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

Если так, то почему не создать это окно при вызове первой, безобидной функции "Ты здесь?"
4 окт 18, 14:13    [21695224]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
Flying-home
Если так, то почему не создать это окно при вызове первой, безобидной функции "Ты здесь?"
С этим вопросом - к разработчикам.

Я вам указал вероятную причину. Единственное чем отличается основной поток от дополнительных - наличие очереди обработки сообщений
4 окт 18, 14:24    [21695237]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Я вам указал вероятную причину.

Это причина по которой функции могут не работать. Ошибка 216 от этого вряд ли вылезет.

Аффтар, DrMemory в руки и смотреть где shit happen.

Posted via ActualForum NNTP Server 1.5

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

Откуда: Санкт-Петербург
Сообщений: 24625
_Vasilisk_
Единственное чем отличается основной поток от дополнительных - наличие очереди обработки сообщений

Откуда уверенность, что у доп. потока нет очереди сообщений?
4 окт 18, 15:04    [21695311]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Короче, мне надоело.
Напиши уже IsMultiThreaded := True в begin end файла dpr библиотеки.
4 окт 18, 15:30    [21695366]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
YuRock
Напиши уже IsMultiThreaded := True в begin end файла dpr библиотеки.
Я не уверен, что библиотека у автора с исходниками и на делфи
wadman
Откуда уверенность, что у доп. потока нет очереди сообщений?
Хрустальный шар
4 окт 18, 15:50    [21695411]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14064
Кстати, раз уж зашел разговор про память, меня давно мучает вопрос. Могу ли я создавать StringList в одной процедуре, а освобождать в другой? Ведь если не забывать про освобождение, проблем не должно быть?
  ...
  Lines := StringParts(Line);
  ...
  Lines.Free;
  ...

function StringParts(s : String) : TStringList;
begin
  result := TStringList.Create;
  result.Delimiter := ',';
  result.StrictDelimiter := true;
  result.DelimitedText := s;
end;


И это, прога заработала. Всем спасибо за обсуждение. Первый вызов делаю в основном потоке.
4 окт 18, 18:04    [21695608]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10643
Flying-home
Могу ли я создавать StringList в одной процедуре, а освобождать в другой?
Если аккуратно, то можно
  ...
  Lines := StringParts(Line);
  try
    ...
  finally
    Lines.Free;
  end;
  ...

function StringParts(s : String) : TStringList;
begin
  result := TStringList.Create;
  try
    result.Delimiter := ',';
    result.StrictDelimiter := true;
    result.DelimitedText := s;
  except
    Result.Free;
    raise;
  end;
end;
4 окт 18, 18:46    [21695666]     Ответить | Цитировать Сообщить модератору
 Re: С вызовом external функции из потока какие-то непонятки  [new]
Flying-home
Member

Откуда: nas.vrostove.net
Сообщений: 14064
Похоже, действительно, этот API потоконебезопасный.
автор
Closing the API

function oziCloseApi:integer;stdcall;

Versions
API - 1.08

Frees up any windows or data the dll has created for its own use.

The function should be called before your own program exits otherwise you may get an error (especially if running on win 2000).

If programming in Delphi you could place the call in the Destroy method of your main form.
5 окт 18, 08:49    [21695971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить