![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно-ли прервать функцию из 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. Ща у себя пороюсь, мож кину екзампл.