gpt4 book ai didi

android - Android 上的 Delphi XE8 TThread Frozen,但适用于 Windows

转载 作者:行者123 更新时间:2023-11-29 20:08:53 24 4
gpt4 key购买 nike

我将一个线程和一个同步过程用于一个简单的游戏循环。在我的 Windows 7 电脑上,它的工作原理非常棒,但是当我在我的 android 设备上运行它并单击播放后线程启动时,屏幕变黑或有时变暗,有时它保持正常但所有对象都在屏幕上可见拉伸(stretch)或无法正确渲染;此时线程似乎被卡住了(主窗体的音乐仍在继续播放)。

这是线程本身:

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;

最佳答案

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

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

另外,也不要在线程中调用 Application.ProcessMessages()。它只属于主 UI 线程。即便如此,如果您必须报告调用它,那么您很可能一开始就做错了。在正常情况下,您永远不必诉诸手动调用它。

关于android - Android 上的 Delphi XE8 TThread Frozen,但适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35299846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com