Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизКак приостановить выполнение функции, вызванной из DLL Найти похожие ветки
← →
TAHAT (2005-01-31 16:57) [0]Проблема, собсно, состоит в следующем. Приложение решает сложную математическую задачу. Для этого используется DLL от стороннего произвотителя. В приложении создается поток (наследник TThread), с приватным полем, которое содержит данные задачи. В теле потока к этим данным применяется функция, вызываемая из DLL. Сама DLL линкуется статически. При попытке приостановить или разрушить поток, функция продолжает выполняться. Все бы ничего, но выполняться она может несколько часов или СУТОК. Как все-таки получить над ней контроль ???
← →
default © (2005-01-31 17:05) [1]что значит контроль?приостановить?не проблема, для этого надо приостановить поток в теле которого вызывается эта функция
← →
TAHAT (2005-01-31 17:15) [2]При попытке приостановить или разрушить поток, функция продолжает выполняться...
я ему MyThread.Suspend, а он ждет, когда эта функция завершиться, и только после этого переходит в паузу...
← →
Digitman © (2005-01-31 17:21) [3]
> я ему MyThread.Suspend, а он ждет, когда эта функция завершиться,
> и только после этого переходит в паузу
ой не ври
← →
default © (2005-01-31 17:22) [4]покажи код
← →
Digitman © (2005-01-31 17:25) [5]
> а он ждет, когда эта функция завершиться
кто "он" ?!
какая "функция" ?!
в случае вызова неким кодом метода MyThread.Suspend практически немедленно же выполняется SuspendThread(), и целевой код.поток практически немедленно же оставливается
далее ты вправе мордовать целевой код.поток как сочтешь нужным.
в чем же проблема ?
← →
TAHAT (2005-01-31 17:30) [6]Function LPXInteger(pLPX: Pointer): Integer; cdecl;
external; "dllname.dll" name "glp_lpx_integer";
TMyThread.Execute
Var
ExitCode: Integer;
begin
...
ExitCode := LPXInteger(Self.FLPXObj);
...
end;
здесь FLPXObj - переменнтая типа TLPXObj = Pointer;
вот, собсно, и все... или весь проект запостить ?
← →
default © (2005-01-31 17:38) [7]этот код ни о чём не говорит
пойми, после компоновки с DLL считай что она часть твоего процесса, то есть когда поток вызывает ф-ию DLL считай что вызывается обычная функция в программе
при остановке же потока который вып-ет данную ф-ию процессор попросту не выделяет ему времени для выполнения, то есть после приостановки потока невозможно вып-ие им кода(в частности кода твоей ф-ции в DLL) до возобновления через Resume
← →
TAHAT (2005-01-31 17:54) [8]Это я и сам прекрасно понимаю... мозгом... но программа почему-то ведет себя именно так как я опсал. Более того, если сразу после Suspend выполнить MyThread.Free, то поток уничтожается, а функция продолжает выполняться еще минут 20, после чего начинает орать, что ей некуда присвоить значение ExitCode.
Я уже и не знаю, что думать. Могу добавить, что параметр pLPX в самой этой финкции - это объект, т.е. определен как struct... Я ей передаю pointer, который является результатом вызоба функции CreateLPX из той же библиотеки.
Ктати, я не знаю, возможен ли такой эффект, если предположить, что функция LPXInteger создает в нутри себя еще один поток ??
← →
default © (2005-01-31 17:59) [9]слушай а может ф-ия в DLL создаёт поток и в нём выполняется?
может распараллеливает задачу на несколько потоков?
посмотри какой-нибудь системной утилитой добавляются-ли потоки в системе после вызова этой функции
← →
Eraser © (2005-01-31 18:14) [10]default ©
Скорее всего так и есть.
TAHAT
sysinternals.com
ищи Process Explorer
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c