F
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.