我写了一个控件,有一个Edit1和一个button1
有一个多线程类ff当我按button1的时候运行代码如下
ff.Create(edit1);
----------------------------------------
ff部分代码如下
--------------增加下面的包--------------
uses StdCtrls,SysUtils;
---------------------------
privite中有个成员变量
i:integer;
----------------------------------
constructor ff.Create(edi:TEdit);
begin
edit1:=edi;
inherited create(false);
end;
---------------------------------
procedure ff.updateaa;
begin
edit1.Text:=intToStr(i);
end;
------------------------------
procedure ff.Execute;
var j:integer;
begin
for j:=0 to 1000 do
begin
i:=j;
Synchronize(updateaa);//运行第一次就死在这里,没有任何错误信息
end;
end;
--------------------------------------------------
问题一:为什么不能运行Synchronize里面的函数
问题二:如果我改为excuet里面改为SocketConnection1.Connected:=true;
然后在AfterConnected的事件中,写向数据库读数据,都是在该线程中运行
为什么?我的Afterconnected是写在文件ActiveXForm中的阿,不是应该在主线程中运行吗?
有一个多线程类ff当我按button1的时候运行代码如下
ff.Create(edit1);
----------------------------------------
ff部分代码如下
--------------增加下面的包--------------
uses StdCtrls,SysUtils;
---------------------------
privite中有个成员变量
i:integer;
----------------------------------
constructor ff.Create(edi:TEdit);
begin
edit1:=edi;
inherited create(false);
end;
---------------------------------
procedure ff.updateaa;
begin
edit1.Text:=intToStr(i);
end;
------------------------------
procedure ff.Execute;
var j:integer;
begin
for j:=0 to 1000 do
begin
i:=j;
Synchronize(updateaa);//运行第一次就死在这里,没有任何错误信息
end;
end;
--------------------------------------------------
问题一:为什么不能运行Synchronize里面的函数
问题二:如果我改为excuet里面改为SocketConnection1.Connected:=true;
然后在AfterConnected的事件中,写向数据库读数据,都是在该线程中运行
为什么?我的Afterconnected是写在文件ActiveXForm中的阿,不是应该在主线程中运行吗?
------------------------------
procedure ff.Execute;
var j:integer;
begin
for j:=0 to 1000 do
begin
i:=j;
Synchronize(updateaa);//运行第一次就死在这里,没有任何错误信息
if terminated
then
exit;
end;
end;
--------------------------------------------------
但是我把程序关闭,但是delphi还是显示running,必须使用ctrl+F2才能结束
原来窗体的线程和ocx事不同的1)窗体的多线程是在窗体的进程下分出来的所以要用到Synchronize同步
2)而控件本身在窗体的进程下分出来的,而控件里面的线程就也是在窗体的进程下面
procedure ff.Execute;
var j:integer;
begin
for j:=0 to 1000 do
begin
i:=j;
// Synchronize(updateaa);
//改为
updateaa // 就可以使用了
if terminated
then
exit;
end;
end;
线程和控件线程是主线程得子线程,所以没有权限关闭,我猜,希望有高人指点)
所以在
button1onclick(Sender:Tobject
begin;
with ff.Create(edit1) do
ff.onTramint(忘了怎样写):=afterAction;
//永远都不会执行,因为线程只有在窗体(进程)关闭才结束
end;procedure afterAction
begin
showmessage('线程完成');
end;