SuspendThread - Thread Ausführung unterbrechen



  • Hallo,

    ich weiß, dass es Delphi-Code ist, aber ich brauche drigend euere Hilfe ;-). Bei Verwendung von WinAPI-Routinen spielt das eh kaum eine Rolle.

    Ich habe einen Thread der mehrfach gestartet werden muss. Da das eigentliche Programme zu viel Komplexität hat, habe ich das Problem auf ein ganz einfaches Beispiel heruntergebrochen:

    program RTT;
    {$APPTYPE CONSOLE}
    uses
      Windows,
      sysutils;
    
    type
    	TParam = record
      	PHandle : ^THandle;
        PInt		: ^Integer;
      end;
    
    var
    	Int 			 : Integer = 0;
      hThread 	 : THandle;
      ExitEvent  : THandle;
      dwThreadID : DWORD;
      Param			 : TParam;
      msg				 : tagMSG;
      dwStatus   : DWORD;
      bCanceled  : Boolean = false;
    
    function ThreadFunc(lpParams: Pointer): Integer; stdcall;
    var
    	PParam : ^TParam absolute lpParams;
    begin
    	while not bCanceled do
      begin
        Inc(PParam^.PInt^);
        SetEvent(ExitEvent);
        SuspendThread(PParam^.PHandle^);
        writeln('test');
      end;
    
      writeln('Thread will be terminated');
      ExitThread(0);
    end;
    
    begin
    
      ExitEvent := CreateEvent(nil, true, false, nil);
    
      hThread := CreateThread(
      	nil,
        0,
        @ThreadFunc,
        @Param,
        CREATE_SUSPENDED,
        dwThreadID
      );
    
      Param.PHandle := @hThread;
      Param.PInt 		:= @Int;
    
      while( Int <> 1000 ) do
      begin
      	ResumeThread(hThread);
    
      	while(true) do
        begin
          while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
            DispatchMessage(msg);
    
          dwStatus := MsgWaitForMultipleObjects(1, ExitEvent, false, INFINITE, QS_ALLINPUT);
    
          if( dwStatus = (WAIT_OBJECT_0 + 1) ) then
          	continue
          else
          	break;
        end;
    
        writeln(Int);
      end;
    
      bCanceled := true;
      ResumeThread(hThread);
    
      readln;
    end.
    

    Leider funktioniert das nicht wirklich. Mal wird eine Zahl doppelt ausgegeben, mal kommt mehrfach hintereinander "test" ... wie kann man das richtig lösen? SuspendThread ist ja mehr für Debugger.


Anmelden zum Antworten