【发布时间】:2014-01-10 17:35:11
【问题描述】:
给定以下类:
type
GEvent = class(TThread)
public
procedure Terminate;
procedure Call(Event : GEvent);
constructor Create;
procedure Execute; Override;
end;
TDirection = (DUp, DRight, DDown, DLeft);
EventTitle = class(GEvent)
private
Index : Integer;
Sprite : CSprite;
Terminate : Boolean;
procedure CreateSprite;
procedure MoveCursor(Direction : TDirection);
procedure RefreshCursor;
constructor Create;
destructor Destroy;
public
procedure Execute;
end;
implementation
{ GEvent }
procedure GEvent.Call(Event: GEvent);
begin
Suspend;
// inherited Terminate;
Self := GEvent(Event.ClassType.Create);
end;
constructor GEvent.Create;
begin
inherited Create(True);
end;
destructor GEvent.Destroy;
begin
Terminate;
inherited;
end;
procedure GEvent.Execute;
begin
// inherited;
end;
procedure GEvent.Terminate;
begin
Suspend;
inherited;
end;
{ EventTitle }
constructor EventTitle.Create;
begin
inherited;
Resume;
end;
procedure EventTitle.CreateSprite;
begin
Showmessage('anything');
end;
destructor EventTitle.Destroy;
begin
inherited;
end;
procedure EventTitle.Execute;
begin
inherited;
Synchronize(CreateSprite);
Index := 0; {
while not Terminated do
begin
if GISystem.System.Input.Trigger(KUp) then
MoveCursor(DUp);
if GISystem.System.Input.Trigger(KDown) then
MoveCursor(DDown);
end; }
end;
当主窗体自动调用InstanceVar := EventTitle.Create 时,线程应该到达方法CreateSprite,奇怪的是没有发生。我不明白为什么该方法没有被执行。应用程序的主要形式仍然可以正常工作,但似乎EventTitle.Execute 突然停止甚至不启动。这也可能是错误的实现。这是我的第一次多线程试验,如有任何不一致之处,请见谅。谁能看到我做错了什么?
【问题讨论】:
-
OT:不要使用
Suspend和Resume。它们已被弃用,因为编译器会在警告中向您报告...同时将线程创建为挂起并立即恢复看起来并没有多大用处。 -
真的。我会让
Resume给子线程。删除它... -
也许使用 OmniThreadLibrary 比深入研究 TThread 内部更容易
标签: multithreading delphi delphi-xe3