Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возможно-ли прервать функцию из dll [D6, D7, NT4, Win2k, WinXP]


AbrosimovA ©   (2007-06-23 15:14:00) 

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

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


AbrosimovA   (2007-06-23 17:04:00) [1]

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


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


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


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

// var T:UINT;

function RunProcedure(Delay:Word) :UINT;

Так лучше? :)


Инс   (2007-06-23 16:46:00) [3]


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


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

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


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


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


У меня проще!


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

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

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 без надобности. Впрочем точно я не помню, глянь справку.


Инс   (2007-06-23 15:31:00) [6]


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


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо