Ik ben sinds een paar dagen bezig met een zogenaamde MUD te maken. Hierbij loggen een x aantal users in op een server waarin ze dan via getypte commando's een spel kunnen spelen.
Alles goed en aardig het werkt prima, maar nu heeft elke gebruiker een eigen TTimer nodig. Die zal ik dynamisch moeten aanmaken want er is geen maximum aantal spelers.
Elke ingelogde speler wordt een TUser. Hierin zit onder andere een TTimer. Dit ziet er zo uit:
Na debuggen ben ik erachter gekomen dat de TTimer zoals verwacht wel wordt aagemaakt, ook aan staat en het interval staat ook goed, in een andere procedure van TUser kan ik deze waardes ook aanpassen, heb ik ook getest. Nu vraag ik me alleen af waarom TimerExecute nooit wordt uitgevoerd.
Ik heb eens voor de gein een TUser onbuttonclick aangemaakt, grappig genoeg werkt de timer dan wel. Ik verwacht dan ook dat het zich om dit stukje code gaat.
En dan met name om deze regel:
Hier blijft de Thread namelijk steeds wachten op commando's. Na wat zoeken op google en in de search verwacht ik dat het hier gaat om een BusyWaiting probleem. Alleen ik heb geen idee hoe ik dit moet oplossen.
Wat ik heb geprobeerd is dit:
vervangen door:
Hiermee was het probleem van de timer alleen niet opgelost.
/me is ten einde wanhoop..
Hopelijk is er hier een guru die me kan helpen want ik heb die timer echt nodig.
Hmm, ik heb iets teveel geedit van mijn topictitel, kan een modje er misschien "[Delphi] Dynamic TTimer werkt niet. BusyWaiting probleem?" van maken?
Alles goed en aardig het werkt prima, maar nu heeft elke gebruiker een eigen TTimer nodig. Die zal ik dynamisch moeten aanmaken want er is geen maximum aantal spelers.
Elke ingelogde speler wordt een TUser. Hierin zit onder andere een TTimer. Dit ziet er zo uit:
code:
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
28
29
30
| TUser = class
// hier wat properties
Timer: TTimer;
private
public
// hier nog heel wat functies en procedures
constructor Create(n: String; T: TIdPeerThread);
procedure TimerExecute(Sender: TObject);
end;
constructor TUser.Create(n: String; T: TIdPeerThread);
begin
// wat statements
Timer := TTimer.Create(nil);
Timer.Interval := 1000;
Timer.Enabled := True;
Timer.OnTimer := TimerExecute;
// en nog een paar
end;
procedure TUser.TimerExecute(Sender: TObject);
begin
Output('{rTimer'); // debug statement uiteraard
{ case U.Fightstatus of
_SWP: Sweep(U, U.FightingWith);
_RNH: Roundhouse(U, U.FightingWith);
end;
Enabled := False; }
end; |
Na debuggen ben ik erachter gekomen dat de TTimer zoals verwacht wel wordt aagemaakt, ook aan staat en het interval staat ook goed, in een andere procedure van TUser kan ik deze waardes ook aanpassen, heb ik ook getest. Nu vraag ik me alleen af waarom TimerExecute nooit wordt uitgevoerd.
Ik heb eens voor de gein een TUser onbuttonclick aangemaakt, grappig genoeg werkt de timer dan wel. Ik verwacht dan ook dat het zich om dit stukje code gaat.
code:
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
| procedure TForm1.IdTelnetServer1Execute(AThread: TIdPeerThread);
var User: TUser;
begin
User := FindUserByThread(AThread);
if (User<>nil) and (User.Linkdead = True) then
User.Reconnected(AThread);
if User = nil then
begin
User := TUser.Create('[LoggingIn...]', AThread);
AllThreads.Add(User);
// inlogbegroeting
end
else
case User.ConStatus of
// inlogzooi
IDLE:
begin
try
cmd := User.Thread.Connection.ReadLnWait;
ExecuteCommand(cmd, User);
User.Showhud;
except end;
end
end;
end; |
En dan met name om deze regel:
code:
1
| cmd := User.Thread.Connection.ReadLn; |
Hier blijft de Thread namelijk steeds wachten op commando's. Na wat zoeken op google en in de search verwacht ik dat het hier gaat om een BusyWaiting probleem. Alleen ik heb geen idee hoe ik dit moet oplossen.
Wat ik heb geprobeerd is dit:
code:
1
2
3
| cmd := User.Thread.Connection.ReadLnWait;
ExecuteCommand(cmd, User);
User.Showhud; |
vervangen door:
code:
1
2
3
4
5
| cmd := User.Thread.Connection.ReadLnWait('', 100); // timeout toegevoegd
if not User.Thread.Connection.ReadLnTimedOut then
ExecuteCommand(cmd, User);
User.Showhud;
end; |
Hiermee was het probleem van de timer alleen niet opgelost.
/me is ten einde wanhoop..
Hopelijk is er hier een guru die me kan helpen want ik heb die timer echt nodig.
Hmm, ik heb iets teveel geedit van mijn topictitel, kan een modje er misschien "[Delphi] Dynamic TTimer werkt niet. BusyWaiting probleem?" van maken?
[ Voor 4% gewijzigd door Verwijderd op 05-01-2005 11:37 ]