[Delphi]Kijken of thread nog loopt of al klaar is

Pagina: 1
Acties:

  • Paul
  • Registratie: September 2000
  • Laatst online: 26-05 18:02
Ik wil hier d.m.v. de remote api (rapi) bestanden van de pc naar een pda zetten.

Op zich werkt dat allemaal goed, alleen als de pda niet is aangesloten dan hangt het geheel op CeRapiInit, zeg maar de constructor van de rapi :)
Gaat het goed, dan komt hij er meteen doorheen, gaat het fout dan komt hij er nooit doorheen. Je kunt na 10 seconden wachten veilig stellen dat het nooit meer gaat lukken, ook niet als je alsnog de pda aansluit :(

Nou, dan zet je die CeRapiInit toch in een thread, en wacht je met WaitForSingleObject voor een bepaalde tijd, waarna je de thread killed (TerminateThread, ding roept alleen CeRapiInit aan dus geen memleaks (toch?)).

Het probleem is echter, dat ik afaik geen manier heb om te kijken of de thread goed is doorlopen:
• FreeOnTerminate freed wel de thread, maar Assigned of 'is TTestThread' werkt niet
• Synchronize aanroepen levert een deadlock op door WaitForSingleObject
• Het OnTerminate-event werkt ook niet door WaitForSingleObject dus daarin kan ik geen FreeAndNil aanroepen.
• De Terminated-property is protected en niet public, dus die kan ik buiten de thread ook niet aanroepen.
• Terminate en WaitFor werken niet omdat het maar 1 commando is ((R)API-call) waar ik geen invloed op kan uitoefenen
• Een globale variabele setten is afaik niet threadsafe

Die laatste weet ik echter niet zeker... Kan ik (veilig) een public variabele in TTestThread maken en deze in de mainthread uitlezen?
Of hoe los ik dit anders op?

Edit: Ik struikel net over GetExitCodeThread, die een STILL_ACTIVE zou retourneren als de thread nog loopt. Ik ga hier eens mee testen :P

[ Voor 5% gewijzigd door Paul op 05-03-2004 11:17 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dat laatste kan als je er maar een property van maakt en zorgt dat de variable niet tegelijk gelezen en geschreven kan worden. Bijvoorbeeld met de classe met misschien wel de langste naam binnen Delphi: TMultiReadExclusiveWriteSynchronizer

We adore chaos because we like to restore order - M.C. Escher


  • Paul
  • Registratie: September 2000
  • Laatst online: 26-05 18:02
Dit volgende lijkt te werken :) Maar toch bedankt :>

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button2Click(Sender: TObject);
var exitCode: Cardinal;
    t: TTestThread;
begin
  t := TTestThread.Create(false);
  WaitForSingleObject(t.Handle, 1000);
  GetExitCodeThread(t.Handle, exitCode);
  if (exitCode = STILL_ACTIVE) then
    TerminateThread(t.Handle, 0);
  t.Free;
end;

procedure TTestThread.Execute;
begin
  { Place thread code here }
  Sleep(20000);
  // CeRapiInit;
end;

[ Voor 4% gewijzigd door Paul op 05-03-2004 11:32 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 27-05 15:56

Tomatoman

Fulltime prutser

Paul Nieuwkamp schreef op 05 maart 2004 @ 10:56:
Een globale variabele setten is afaik niet threadsafe
Dat is correct. Maar waarom gebruik je niet een threadvar? Dat is een threadgebonden variabele, alleen is het gebruik ervan veel eenvoudiger dan een (Windows) thread local variable.

Een goede grap mag vrienden kosten.