Delphi 在窗体上移动按钮时访问冲突
Delphi Access Violation when moving button on form
我正在尝试使用 while 循环检查左边的按钮 属性 来移动表单上的 2 个按钮,但我遇到了访问冲突。我正在使用 CreateThread()
执行程序
The code:
procedure AnimButton1();
var ImageCount: integer;
var b1, b2: integer;
begin
try
while (b2 <> 187) do
begin
b2 := frmNotification.btnBuzina2.Left;
frmNotification.btnBuzina2.Left := b2 - 1;
end;
while (b1 <> 256) do
begin
b1 := frmNotification.btnBuzina.Left;
frmNotification.btnBuzina.Left := b1 - 1;
end;
except;
end;
end;
但是,当我使用至少 5 毫秒的 Sleep() 时,我没有访问冲突,如下所示:
procedure AnimButton1();
var ImageCount: integer;
var b1, b2: integer;
begin
try
while (b2 <> 187) do
begin
b2 := frmNotification.btnBuzina2.Left;
frmNotification.btnBuzina2.Left := b2 - 1;
Sleep(5);
end;
while (b1 <> 256) do
begin
b1 := frmNotification.btnBuzina.Left;
frmNotification.btnBuzina.Left := b1 - 1;
Sleep(5);
end;
except;
end;
end;
有人可以帮我找出为什么没有睡眠我会遇到访问冲突而我却没有吗?
提前谢谢!
I am executing the procedure with CreateThread()
.
那是你的问题。 VCL 代码只能从主 UI 线程调用。使用 TThread.Synchronize
在主线程上调用 VCL 代码。
也就是说,计时器可能比线程更适合解决您的问题。
我正在尝试使用 while 循环检查左边的按钮 属性 来移动表单上的 2 个按钮,但我遇到了访问冲突。我正在使用 CreateThread()
执行程序The code:
procedure AnimButton1();
var ImageCount: integer;
var b1, b2: integer;
begin
try
while (b2 <> 187) do
begin
b2 := frmNotification.btnBuzina2.Left;
frmNotification.btnBuzina2.Left := b2 - 1;
end;
while (b1 <> 256) do
begin
b1 := frmNotification.btnBuzina.Left;
frmNotification.btnBuzina.Left := b1 - 1;
end;
except;
end;
end;
但是,当我使用至少 5 毫秒的 Sleep() 时,我没有访问冲突,如下所示:
procedure AnimButton1();
var ImageCount: integer;
var b1, b2: integer;
begin
try
while (b2 <> 187) do
begin
b2 := frmNotification.btnBuzina2.Left;
frmNotification.btnBuzina2.Left := b2 - 1;
Sleep(5);
end;
while (b1 <> 256) do
begin
b1 := frmNotification.btnBuzina.Left;
frmNotification.btnBuzina.Left := b1 - 1;
Sleep(5);
end;
except;
end;
end;
有人可以帮我找出为什么没有睡眠我会遇到访问冲突而我却没有吗?
提前谢谢!
I am executing the procedure with
CreateThread()
.
那是你的问题。 VCL 代码只能从主 UI 线程调用。使用 TThread.Synchronize
在主线程上调用 VCL 代码。
也就是说,计时器可能比线程更适合解决您的问题。