Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBAPI и APC / 25 сообщений из 30, страница 1 из 2
17.03.2015, 15:03
    #38907200
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
А вы знаете, что IBAPI не совместимо с APC из WinApi ?

В отладчике выяснилось, что APC вылетает из функции select, которую использует внутри gds32.dll. Любой код вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void APIENTRY user_apc(ULONG_PTR dwParam)
{
 //1
}

void main()
{
 QueueUserAPC(user_apc,GetCurrentThread(),0);
 sql q("select 1 from rdb$database");
 //любой sql-оператор на любых компонентах доступа

 //2
}



Попадает в точку 1 перед точкой 2.

Причина этого описана в msdn:

-----------------------------------------------------------
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx

Note When issuing a blocking Winsock call such as select with the timeout parameter set to NULL, Winsock may need to wait for a network event before the call can complete. Winsock performs an alertable wait in this situation, which can be interrupted by an asynchronous procedure call (APC) scheduled on the same thread. Issuing another blocking Winsock call inside an APC that interrupted an ongoing blocking Winsock call on the same thread will lead to undefined behavior, and must never be attempted by Winsock clients.
-----------------------------------------------------------

Печально всё это и лечению не подлежит. Даже если переделать gds32.dll то редистрибьютить его нереально.
...
Рейтинг: 0 / 0
17.03.2015, 15:25
    #38907226
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Печально всё это и лечению не подлежит.
Да, у современной медицины нет средства против анацефалии. Те, у кого есть мозг,
догадаются задействовать третий параметр.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.03.2015, 11:06
    #38908005
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Какой ещё 3тий параметр?
Это грабли, на которые рано или поздно можно наступить.
...
Рейтинг: 0 / 0
18.03.2015, 11:50
    #38908073
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Какой ещё 3тий параметр?
Тот, что идёт сразу после первого и второго. Ты всерьёз полагаешь, что твой колбэк -
единственный и будет вызван только когда ты ожидаешь?..

PS: И я уж не говорю о том, что вся система APC - застарелые хакерские трюки, к применению
негодные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.03.2015, 12:24
    #38908166
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Хм, а ты в курсе что такое вообще Alertable Wait State? В MSDN по этому поводу много буков исписано.
...
Рейтинг: 0 / 0
18.03.2015, 12:32
    #38908184
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Повторяю ещё раз, медленно: любой хук или колбэк, который ты установил в системе имеет
право быть вызван когда угодно, кем угодно и по какому угодно поводу в любой момент после
его установки. С какого перепою ты решил, что он может быть вызван исключительно в точке
2, я понятия не имею. И иметь не хочу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.03.2015, 13:28
    #38908304
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Очередь APC это не хук, и может обрабатываться только в строго в определённые моменты. Иначе ничего работать толком не будет.
...
Рейтинг: 0 / 0
18.03.2015, 14:34
    #38908448
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_,

ты, чем рыдать, объясни лучше - что реально у тебя поломалось ?
...
Рейтинг: 0 / 0
18.03.2015, 14:39
    #38908459
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Я не могу использовать APC в потоке работающим с БД. Например таймеры через SetWaitableTimer с установленной CompletionRoutine
...
Рейтинг: 0 / 0
18.03.2015, 14:45
    #38908472
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_не могу использовать APC в потоке работающим с БД
у тебя клиентская либа от какой версии и какой СУБД (Firebird, InterBase) ?
В пределах одного коннекта вызовы IB/FB API не работают из разных потоков. Разве что в ФБ 2.5 (fbclient.dll) сделана блокировка вызовов, то есть, глючить не будет, но все равно две функции одновременно работать не будут (одна будет ждать завершения другой).
Параллельно будут работать только два разных коннекта.

p.s. редко какие библиотеки sql-серверов позволяют в пределах коннекта операции из разных тредов.
...
Рейтинг: 0 / 0
18.03.2015, 14:54
    #38908495
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Я не могу использовать APC в потоке работающим с БД. Например таймеры через SetWaitableTimer с установленной CompletionRoutineМожешь. Но почему-то для тебя проблема, если твой APC вызовется "внутри" вызова ISC API. Почему ?
...
Рейтинг: 0 / 0
18.03.2015, 15:05
    #38908532
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Очередь APC это не хук, и может обрабатываться только в строго в определённые
моменты.
По названию, назначению и документации это Asynchronous Procedure Call. Из чего
следует, что процедура вызовется тогда, когда система этого захочет.

Смотри сюда: вызвав QueueUserAPC(), ты сказал системе "вызови на досуге эту процедуру в
контексте этого потока с этим параметром". Всё. Ты не можешь и не должен строить никакие
предположения о том когда у потока будет досуг. Точка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.03.2015, 15:23
    #38908565
Коваленко Дмитрий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
kdvВ пределах одного коннекта вызовы IB/FB API не работают из разных потоков.

Если предоставить внешнюю синхронизацию, то все работает. начиная с IB4.

kdvРазве что в ФБ 2.5 (fbclient.dll) сделана блокировка вызовов, то есть, глючить не будет.

В 2.5 она глючит. Для этого надо, конечно, немножко приложить усилия. Но факт остается фактом.

О чем я сообщал Пешкову и Еманову. В переписке по поводу херни с сетевым пакетом.
...
Рейтинг: 0 / 0
19.03.2015, 14:12
    #38909874
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
kdvavp_не могу использовать APC в потоке работающим с БД
у тебя клиентская либа от какой версии и какой СУБД (Firebird, InterBase) ?
В пределах одного коннекта вызовы IB/FB API не работают из разных потоков. Разве что в ФБ 2.5 (fbclient.dll) сделана блокировка вызовов, то есть, глючить не будет, но все равно две функции одновременно работать не будут (одна будет ждать завершения другой).
Параллельно будут работать только два разных коннекта.

p.s. редко какие библиотеки sql-серверов позволяют в пределах коннекта операции из разных тредов.

kdv, с APC можно работать и в однопоточном приложении. Это такой механизм Windows
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681951(v=vs.85).aspx
...
Рейтинг: 0 / 0
19.03.2015, 14:14
    #38909880
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
hvladavp_Я не могу использовать APC в потоке работающим с БД. Например таймеры через SetWaitableTimer с установленной CompletionRoutineМожешь. Но почему-то для тебя проблема, если твой APC вызовется "внутри" вызова ISC API. Почему ?

Контекст невалидный. Представь если бы TTimer->OnTimer в delphi срабатывал бы при работе с DataSet.
Тут такая же картина.
...
Рейтинг: 0 / 0
19.03.2015, 14:49
    #38909951
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Контекст невалидный.
Повторяю ещё раз, медленно: ты не можешь делать никаких предположений о времени вызова
асинхронной процедуры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2015, 14:55
    #38909961
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Контекст невалидный.Ну так это твои проблемы, как прикладного программиста.
Система понятия не имеет о твоём контексте и о твоих требованиях к нему.
Обеспечь :)

Dimitry SibiryakovПовторяю ещё раз, медленно: ты не можешь делать никаких предположений о времени вызова
асинхронной процедуры.++
...
Рейтинг: 0 / 0
19.03.2015, 15:08
    #38909982
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
И все таки тема третьего параметра не раскрыта!
...
Рейтинг: 0 / 0
19.03.2015, 15:13
    #38909990
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_hvladпропущено...
Можешь. Но почему-то для тебя проблема, если твой APC вызовется "внутри" вызова ISC API. Почему ?

Контекст невалидный. Представь если бы TTimer->OnTimer в delphi срабатывал бы при работе с DataSet.
Тут такая же картина.А зачем TTimer'у в дельфи ставить в очередь APC? У него другие задачи. Зачем ты используешь WaitableTimer c процедурой завершения? Тут реально нельзя угадать, когда и в каком месте она будет вызвана. В apc очереди могут быть и другие процедуры, и вызываться они будут по очереди во время перехода потока в тревожное состояние. Таким образом твоя процедура завершения должна быть готова к этим обстоятельствам. Разве не так?
...
Рейтинг: 0 / 0
20.03.2015, 12:49
    #38911020
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
APC вызываются только и исключительно из Alertable Wait State.
Как вы думаете, зачем функцию SleepEx добавили?
...
Рейтинг: 0 / 0
20.03.2015, 12:56
    #38911035
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_APC вызываются только и исключительно из Alertable Wait State.
А ты с какого-то похмелья почему-то считаешь, что у тебя есть эксклюзивная монополия на
приведение потока в это состояние. Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.03.2015, 14:33
    #38911145
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Это обязано быть отображено в документации.
...
Рейтинг: 0 / 0
20.03.2015, 14:54
    #38911169
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_,

в документации на IB/FB API? Почему? Почему это вообще должно быть отражено в любой другой библиотеке?
...
Рейтинг: 0 / 0
20.03.2015, 15:06
    #38911191
avp_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
Потому что это побочный эффект, который нарушает контракт с Win
...
Рейтинг: 0 / 0
20.03.2015, 15:39
    #38911238
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBAPI и APC
avp_Потому что это побочный эффект, который нарушает контракт с WinКакой контракт ?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IBAPI и APC / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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