Einzelnen Beitrag anzeigen

Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Funktionsaufruf einer DLL nach Timeout abbrechen

  Alt 6. Mai 2009, 15:31
Du solltest lesen was ich geschrieben hab ...

Du startest einen Thread, der die DLL Funktion aufruft. Natürlich hast Du von dem Thread das Handle - wird ja von MSDN-Library durchsuchenCreateThread zurückgeliefert . Das Thread Handle kannst Du dann für MSDN-Library durchsuchenWaitForSingleObject benutzen. Das ganze würde in etwa so aussehen:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

type
  TParameters = record
      Parameter1 : dword;
      Parameter2 : dword;
      Parameter3 : dword;
      Result : dword;
  end;
  PParameters = ^TParameters;

function SometimesDoesntReturn(parameter1, parameter2, parameter3 : dword) : dword;
begin
  result := 0;
  case random(2) of
    0 : sleep(INFINITE);
    1 : result := Parameter1 + Parameter2 + Parameter3;
  end;
end;

function CallWrapper(Parameters : PParameters) : dword; stdcall;
begin
  Parameters^.Result := SometimesDoesntReturn(Parameters^.Parameter1, Parameters^.Parameter2, Parameters^.Parameter3);
end;

var
  Parameters : TParameters;
  ThreadID, ThreadHandle : dword;
  i : integer;
begin
  Randomize;

  for i := 0 to 19 do
    begin
      Parameters.Parameter1 := random(100000);
      Parameters.Parameter2 := random(100000);
      Parameters.Parameter3 := random(100000);
      ThreadHandle := CreateThread(nil, 0, @CallWrapper, @Parameters, 0, ThreadID);
      case WaitForSingleObject(ThreadHandle, 1000) of
        WAIT_OBJECT_0 : writeln('Aufruf erfolgreich -> Result: ', Parameters.Result);
        WAIT_TIMEOUT : writeln('Aufruf haengt -> TerminateThread: ', TerminateThread(ThreadHandle, 0));
      end;
      CloseHandle(ThreadHandle);
    end;
  readln;
end.
Fridolin Walther
  Mit Zitat antworten Zitat