我为一个简单的游戏循环使用一个线程和一个同步过程。 在我的电脑上,Windows 7,它作为一个魅力,但当我在我的Android设备上运行它并且在我点击播放并且线程开始后屏幕变黑或有时变暗,有时它保持正常但屏幕上的所有对象都可见拉伸或不能正确渲染;此时线程似乎被冻结(来自主窗体的音乐仍然继续播放)。
这是线程本身:
procedure TTheThread.Loop;
begin
MainForm.GameLoop;
end;
procedure TTheThread.Execute;
begin
while NOT Terminated do
begin
Application.ProcessMessages;
TC:= TStopwatch.GetTimeStamp;
//The Following repeats itself every second:
if TC>(TCTime+10000000) then
begin
TCTime:= TStopwatch.GetTimeStamp;
TimeT:= TimeT+1; //Time in seconds
//Increasing game playing speed:
Gravity:= Gravity + 0.0075 * DEF;
PJump:= PJump+IncJump
end;
//...just to have it on screen:
With MainForm do
Label1.Text:= IntToStr(TC);
//This seems to make the loop run smooth and without lagging on my PC:
if TC>(TCLast) then
begin
Synchronize(Loop);
TCLast:= TC;
end;
end;
end;
这就是它的开始:
TCTime:= TStopwatch.GetTimeStamp;
TCLast:= TCTime;
GameThread:= TTheThread.Create(True);
GameThread.FreeOnTerminate:= True;
GameThread.Start;
答案 0 :(得分:2)
您的线程中包含一些不安全的代码,这很容易导致死锁和死UI(以及其他问题)。 不要直接在线程中访问UI控件,必须与主UI线程同步,例如TThread.Synchronize()
或TThread.Queue()
,例如:
TThread.Synchronize(nil,
procedure
begin
MainForm.Label1.Text := IntToStr(TC);
end
);
另外,也不要在线程中调用Application.ProcessMessages()
。它仅属于主UI线程。即便如此,如果你必须报告完全打电话,你可能会做错事。在正常情况下,您永远不必手动调用它。