Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Возможно-ли прервать функцию из dll   Найти похожие ветки 

 
AbrosimovA ©   (2007-06-23 15:14) [0]

Возможно-ли прервать выполнение функций или процедур, вызываемых из dll, если время их работы превышает заданное и как это оформить в коде?

Например, при вызове функции recvfrom из WS2_32.DLL, она выполняется неопределённо долго и моё приложение как-бы подвисает.


 
Dib@zol   (2007-06-23 15:19) [1]

Попробуй реализовать вызов подпрограммы из Вел. и Уж. Мультимедийного Таймера. По истечении отпущенного ему кванта времени проц обрубает его поток вместе со всем что он там выполняет. Юнит MMSystem, TimeSetEvent+TimeKillEvent. Ща у себя пороюсь, мож кину екзампл.


 
Инс ©   (2007-06-23 15:31) [2]


> Например, при вызове функции recvfrom из WS2_32.DLL, она
> выполняется неопределённо долго и моё приложение как-бы
> подвисает


Может просто использовать неблокирующие сокеты?


 
Dib@zol   (2007-06-23 15:40) [3]

Вот. Даже юнит подключать без надобности.

type
 TMR_CALLBACK = procedure(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;

const
 WinMM = "WinMM.dll";
 TIME_ONESHOT = 0;

var
 T : UINT;

...

function timeSetEvent(uDelay, uResolution: UINT; lpFunction: TMR_CALLBACK; dwUser: DWORD; uFlags: UINT): UINT; stdcall; external WinMM;
//function timeKillEvent(uTimerID: UINT): UINT; stdcall; external WinMM;

...

function RunProcedure(Delay:Word);
// ------------------------------------------------------- \\
procedure _TMR(utimerId, uMessage:uint; dwUser, dw1, dw2 : dword) stdcall;
begin
<Вызов_твоей_процедуры>
end;
// ------------------------------------------------------- \\
begin                                    
result:=timeSetEvent(Delay, Delay, @_TMR, 0, TIME_ONESHOT);
end;

Если компилятор будет ругаться, что в подпроцедуре есть директива STDCALL, просто вынь её из основной.

ЗЫ: При TIME_ONESHOT таймер отрубается на автопилоте, и по-моему вызывать timeKillEvent без надобности. Впрочем точно я не помню, глянь справку.


 
Dib@zol   (2007-06-23 15:41) [4]


> Может просто использовать неблокирующие сокеты?


У меня проще!


 
Инс ©   (2007-06-23 16:46) [5]


> У меня проще!


Только не правильно ;) Автор задал неправильный вопрос, а вы на него дали ответ "в лоб", не задумываясь, как нужно поступить в этой ситуации на самом деле.

AbrosimovA
Сходите по этой ссылке:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021#08


 
Dib@zol   (2007-06-23 16:52) [6]


> Только не правильно ;)


Да ладно уж...

// var T:UINT;

function RunProcedure(Delay:Word):UINT;

Так лучше? :)


 
AbrosimovA ©   (2007-06-23 17:04) [7]

Большое спасибо Dib@zol.



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
2-1199219528
DmT
2008-01-01 23:32
2008.01.27
Копирайт


6-1179131037
Pearled
2007-05-14 12:23
2008.01.27
Как получить сетевой путь к каталогу по его локальному пути?


1-1193170634
Kostafey
2007-10-24 00:17
2008.01.27
Реальность компонентов формы


2-1197306145
Irish_34
2007-12-10 20:02
2008.01.27
UDF


2-1198472251
mikola
2007-12-24 07:57
2008.01.27
индикатор загрузки отправки