Delphi XE8 TThread在Android上冻结,但适用于Windows

时间:2016-02-09 18:48:18

标签: android firemonkey delphi-xe8

我为一个简单的游戏循环使用一个线程和一个同步过程。 在我的电脑上,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;

1 个答案:

答案 0 :(得分:2)

您的线程中包含一些不安全的代码,这很容易导致死锁和死UI(以及其他问题)。 不要直接在线程中访问UI控件,必须与主UI线程同步,例如TThread.Synchronize()TThread.Queue(),例如:

TThread.Synchronize(nil,
  procedure
  begin
    MainForm.Label1.Text := IntToStr(TC);
  end
);

另外,也不要在线程中调用Application.ProcessMessages()。它仅属于主UI线程。即便如此,如果你必须报告完全打电话,你可能会做错事。在正常情况下,您永远不必手动调用它。