请问synchronize一定要在线程的execute里面执行吗?(100分)

  • 主题发起人 主题发起人 tzahz
  • 开始时间 开始时间
T

tzahz

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:
mythread.excute()
begin
synchronize(show_it);
end;

mythread.showit():boolean;
begin
if form1.label1.caption='0' then
form1.label1.caption:='1'
else
form1.label1.caption:='0'
end;

为何报错?
 
mythread.showit():boolean;
你的返回值在哪里定义的?
有必要么?
procedure mythread.showit();
begin
if form1.label1.caption='0' then
form1.label1.caption:='1'
else
form1.label1.caption:='0'
end;

procedure mythread.excute()
begin
synchronize(show_it);
end;

 
synchronize是用来同步vcl object的事件的不一定在execute里面写的
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=760828
希望对你有点帮助。
 
synchronize只有在线程涉及到多线程同步时才使用,其它情况没有必要使用.
另外,楼上两位的线程的execute过程应该是这样:
procedure mythread.excute()
begin
while not terminateddo
begin
synchronize(show_it);
end;
end;

procedure mythread.showit()
begin
if form1.label1.caption='0' then
form1.label1.caption:='1'
else
form1.label1.caption:='0'
end;

 
楼上想搞循环浪费资源啊!
 
关注:
有那位知道synchronize(show_it)的执行过程?是由线程本身装载Show_it 来执行能,
还是有线程所在的进程来执行(此时线程的状态如何?是 suspend 还是 resume 状态?
 
to ChinaYA:到我给的链接去看看吧,应该有你要的答案的。
 
look 1 look
 
将子线程放到主线程里面来运行。。[:)]
 
书上说的明白,这个方法实际是用sendmessage向主线程发消息,
通知主的应该执行哪个方法,主线程就不断从线程队列中去取,
这样在一个时刻可以保证只有一个线程的方法访问vcl
 
synchronize()里面的参数是个过程,不能是个函数
你的 showit 是个函数,所以不能编译通过了。
 
Campo说得没错,这才是无法编译通过的真正原因。
 
应该用过程,我好象没有用这东东同步过函数!
 
有时很有用,Synchronize只能是方法指针,类里面的方法指针,所以你的程序是编绎不过的
Synchronize其实是在Classes单元中另开了一个线程,专门执行一些可能时间较长,或者说
比较次要的过程;
type
TThreadMethod = procedure of object;
procedure TThread.Synchronzie(Method: TThreadMethod);
begin
Postmessage(ASomeHandle, WM_Method, 0, Integer(@Method));
end;
所以说它只能是类中的方法指针。
 
synchronize是用来同步vcl object的事件.其实就是指针。
 
你的代码报错的原因和你的问题没有关系
Synchronize(Method: TThreadMethod) ;
其中 TThreadMethod的定义为:
type
TThreadMethod = procedure of object ;
所以Synchronize()跟的参数必须是 不含参数的过程 ,所以你的程序报错!
 
接受答案了.
 
后退
顶部