VCL线程不安全,用Synchronize,结果界面死机,和没用线程一样了,求解,多谢
VCL线程不安全,用Synchronize,结果界面死机,和没用线程一样了,求解,谢谢!
1.线程里面调用VCL不安全,到底怎么操作不安全,我做一个字幕滚动,就改下LABEL的位置安全否?不见控件操作起来安全否,比如TCientSockte?
2.把字幕滚动的过程labelroll()放到Synchronize,结果界面冻结了,直接放到线程中则没事(但是不安全?)
procedure labelroll()
begin
while( Label1.Top>-16)do
begin
Label1.Top:=Label1.Top-2;
Label2.Top:=Label2.Top-2;
Sleep(1000);
end;
end;
我想正确的写法可能是线程中放:
while( Label1.Top>-16)do
begin
Synchronize(移动LABEL);
Sleep(1000);
end;
3.我有一个函数,里面有很多操作,需要放到一个线程里面执行.
我发现Synchronize(直接套这个函数),结果执行时界面冻结,就是说用Synchronize时,多程序根本不起作用.
但是函数里面有很多VCL控件,大部分是涉及网络操作的不可见控件,这些控件不套用Synchronize安全吗?
谢谢大家!
------解决方案--------------------
可视VCL组件,只能在主线程中操作,都是线程不安全的。
------解决方案--------------------
------解决方案--------------------
VCL线程不安全是说界面相关的部分控件(有几个控件有线程安全方面的东西)。IdIcmpClient是其他公司开发的,不算在VCL里面。
放到Synchronize的函数必须短小。另外你那个Sleep(1000)都放到Synchronize里肯定死机。
1.线程里面调用VCL不安全,到底怎么操作不安全,我做一个字幕滚动,就改下LABEL的位置安全否?不见控件操作起来安全否,比如TCientSockte?
2.把字幕滚动的过程labelroll()放到Synchronize,结果界面冻结了,直接放到线程中则没事(但是不安全?)
procedure labelroll()
begin
while( Label1.Top>-16)do
begin
Label1.Top:=Label1.Top-2;
Label2.Top:=Label2.Top-2;
Sleep(1000);
end;
end;
我想正确的写法可能是线程中放:
while( Label1.Top>-16)do
begin
Synchronize(移动LABEL);
Sleep(1000);
end;
3.我有一个函数,里面有很多操作,需要放到一个线程里面执行.
我发现Synchronize(直接套这个函数),结果执行时界面冻结,就是说用Synchronize时,多程序根本不起作用.
但是函数里面有很多VCL控件,大部分是涉及网络操作的不可见控件,这些控件不套用Synchronize安全吗?
谢谢大家!
------解决方案--------------------
可视VCL组件,只能在主线程中操作,都是线程不安全的。
------解决方案--------------------
------解决方案--------------------
VCL线程不安全是说界面相关的部分控件(有几个控件有线程安全方面的东西)。IdIcmpClient是其他公司开发的,不算在VCL里面。
放到Synchronize的函数必须短小。另外你那个Sleep(1000)都放到Synchronize里肯定死机。