this slowpoke moves

Create Server Thread

private
    { Private declarations }
    // SeverThread-Handle;
    hThread: THandle;
    
const
  SERVERSHUTDOWN = 'KillYourself'; // Zeichenfolge, die ServerThread beendet
  SERVERSTOPPED = 'Server-Thread wurde beendet';
  TIMEOUT = 2500;

var
  Form1: TForm1;

  EventRequestSubmitted: THandle; // Ereignis wenn Client Daten für Server hat
  EventRequestProcessed: THandle; // Ereignis vom Server, wenn Daten berabeitet
  SharedBuffer: string; // gemeinsamer Buffer für Server und Client

//

function UppercaseString(s: string): string;
begin
  result := UpperCase(s);
end;

function ServerThread(p: Pointer): Integer;
var
  bShutDown: Boolean;
begin
  bShutDown := False;
  while not bShutDown do
  begin
    // auf Client-Event warten
    WaitForSingleObject(EventReQuestSubmitted, INFINITE);
    bShutDown := SharedBuffer = SERVERSHUTDOWN;
    if not bShutDown then
      SharedBuffer := UppercaseString(SharedBuffer)
    else
      SharedBuffer := SERVERSTOPPED;
    // Client mitteilen, dass Request bearbeitet wurde
    SetEvent(EventRequestProcessed);
  end;
  SetEvent(EventRequestProcessed);
  result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  wfso: DWORD;
resourcestring
  rsServerStopped = 'Server-Thread läuft nicht mehr';
begin
  // Daten in den gemeinsamen Puffer kopieren
  SharedBuffer := Edit1.Text;
  // Server auf Request hinweisen
  SetEvent(EventRequestSubmitted);
  // auf Server warten
  wfso := WaitForSingleObject(EventRequestProcessed, TIMEOUT);
  if wfso = WAIT_TIMEOUT then
    Messagebox(Handle, PChar(rsServerStopped), PChar(Caption), MB_ICONWARNING);
  // Daten anzeigen
  Edit2.Caption := SharedBuffer;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ThreadID: Cardinal;
begin
  // Events erzeugen
  EventRequestSubmitted := CreateEvent(nil, False, False, nil);
  EventRequestProcessed := CreateEvent(nil, False, False, nil);
  hThread := BeginThread(nil, 0, @ServerThread, nil, 0, ThreadID);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Handles: array[0..1] of THandle;
begin
  // Benutzer beendet Programm, ServerThread schließen
  SharedBuffer := SERVERSHUTDOWN;
  SetEvent(EventRequestSubmitted);
  Handles[0] := EventRequestProcessed;
  Handles[1] := hThread;
  // warten bis ServerThread Beendigung bestätigt
  WaitForMultipleObjects(2, @Handles, TRUE, INFINITE);
  // Aufräumen
  CloseHandle(hThread);
  CloseHandle(EventRequestSubmitted);
  CloseHandle(EventRequestProcessed);
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate