Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
14-1108675062
AlterEgo of WondeRu
2005-02-18 00:17
2005.03.13
Женский алкоголизм


1-1109571508
Chaos_BUG
2005-02-28 09:18
2005.03.13
Исходники EncryptPE. Помогите с компиляцией.


1-1109693035
Expl
2005-03-01 19:03
2005.03.13
Как определить создан ли экземпляр какого-либо класса?


14-1108471375
juice
2005-02-15 15:42
2005.03.13
Книжка по NET


1-1109336235
Kat
2005-02-25 15:57
2005.03.13
Один из компонентов Tedit на панели не должен входить в условиие





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский