Главная страница
    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.035 c
8-1098777398
Slonco
2004-10-26 11:56
2005.03.13
Как отправить звуковую почту?


3-1108103653
dma
2005-02-11 09:34
2005.03.13
Обновление loockup полей


14-1108901707
Antonn
2005-02-20 15:15
2005.03.13
Фото Винни-Пуха :)


1-1109315695
Нуждающийся в помощи
2005-02-25 10:14
2005.03.13
Бинарные операции


6-1105227027
Raider
2005-01-09 02:30
2005.03.13
Поиск сервера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский