我自己测试的时候,是这个现象,希望得到高手的指点,和确认:假设我建立一个线程类 TMythread=class(TThread)
有个TMythread的对象 aObj:TMyThread;
问题一:
1:如果aObj还在执行execute方法中的代码,
  这时候,如果我执行aObj.Termiante,是不是要等execute()方法中的程序执行完毕之后,才会Terminate.
  如果,我先把aObj.Suspend,然后Terminate,那么会立即终止。疑问2:
  我在TMyThread.Execute();
      begin
        FreeOnTerminate:=True;
        OnTerminate:=Form1.pd1; //指定一个事件给OnTerminate
        .......
      end;为什么我执行aObj.Terminate的时候,不会执行OnTerminate指定的事件
 ???????????????

解决方案 »

  1.   

    疑问1:
    terminate要等execute执行完才会执行
    没试过Suspend下terminate是否会终止,写个简单的例子试一下疑问2:你要在Form1中这样写代码
    aObj.Onterminate = pd1;
      

  2.   

    这俩问题都应该反过来问,凭啥你一 Terminate 线程就结束?
      

  3.   

    Terminate只是把Terminated属性设置为true
    你可以再线程里判断该值才决定是否退出 并不会强制中止线程这一点和API TerminateThread不一样 这个是强行干掉的
      

  4.   

    还有一个疑问:
     如果线程对象aObj还在执行execute()方法中的内容,那么我调用aObj的Terminate方法,
     要等到execute中的内容执行完了之后,线程对象aObj才会终止。 我的问题是:如果aObj还在执行中,这时候我调用挂起线程的方法aObj.Suspend;
      然后再执行aObj.Terminate();
     那应该也要等到aObj唤醒时,把execute()中代码执行完成后,线程才会终止吧??????
      

  5.   

    还有一个关于synchronize方法的疑问:
    在线程内部如果使用Synchronize(....)来控制窗体的vcl控件,是把该该处理过程放在主线程的执行队列中,等待主线程运行。那会不会出现这样的情况,会不会出现这种情况:synchronize(...)方法中的在操作vcl的同时,主线程也操作vcl(比如鼠标操作了该vcl控件)???
      

  6.   

    会出现,但是消息有先后次序,synchronize只是扔了消息放到啊队列中了
      

  7.   

    synchronize就是把线程挂起,把他里面的method放到主线程队列里执行,主线程是按顺序执行的
    所以不会造成同时执行