Entwickler-Ecke

Windows API - WinXp + D6 WaitForSingleObject hängt ganze exe auf


OL-Langer - Mo 21.10.02 21:02
Titel: WinXp + D6 WaitForSingleObject hängt ganze exe auf

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var hEve : THandle;
begin
   hEve := CreateEvent(nil,False,False,'TEST');
  ...
...
...
...
   WaitForSingleObject(hEve,INFINTE);

ab hier geht nix mehr bis das ereigniss ausgelöst wurde. selbst wenn ich einen extra thread starte geht nix mehr, werde noch wahnsinnig, hoffe ihr habt nee Lösung für mich


AndyB - Mo 21.10.02 21:25

Was erwartest du denn von einer Funktion die WarteAufEinzelnesObjekt(hEv, unendlich) heißt?

probiere es mal so:

Quelltext
1:
2:
while WaitForSingelObject(hEve, 100) = WAIT_TIMEOUT do
  Application.ProcessMessages;

Damit reagiert deine Anwendung noch, während jedoch gewartet wird.


OL-Langer - Mo 21.10.02 22:08

:D
Okay danke dir ,aber wieso hängt meine ganze anwendung wenn ich in einem extra thread warte ?? Nur um was zu lernen


AndyB - Mo 21.10.02 22:56

Das kann ich dir nicht beantworten, da bei mir dieses Phämomen nicht auftritt.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

function MyThread(Param: Pointer): Integer;
var hEve : THandle;
begin
  hEve := CreateEvent(nil,False,False,'TEST');
  WaitForSingleObject(hEve, INFINITE);
  ShowMessage('Hallo');
  Result := 0;
end;

procedure TMyThread.Execute;
begin
  MyThread(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var ThreadId: THandle;
begin
//  BeginThread(nil, 0, MyThread, nil, 0, ThreadId);
  with TMyThread.Create(False) do
    FreeOnTerminate := True;
end;


OL-Langer - Di 22.10.02 20:37

Okay du nimmst nee thread unit (also Klasse von TTHREAD) ... vielleicht sollte ich das auch so machen , habe nee procedure gemacht und die mit CreateThread (Procedure als pointer übergeben) erzeugt und in der gewartet , werde es mal testen ,danke für die Gute Hilfe

Gruss OLI


AndyB - Di 22.10.02 22:14

CreateThread solltest du nicht verwenden. Dazu hat Borland die Funktion BeginThread eingeführt, die die Speicherverwaltung threadsicher macht.
In meinem Code habe ich beides verwendet BeginThread und TThread. Du musst nur das '//' vor dem BeginThread entfernen und die TThread-Abhängigen Sachen auskommentieren.


OL-Langer - Mi 23.10.02 22:30

Ja danke dir :)) habe es verstanden

Gruss OLI