怎样让派生线程可访问和修改主线程的一个数组?
我在线程创建时把数组指针传给了每一个子线程,后来发现这样行不通.
程序一执行就死掉.
哪位知道应该怎样做?
最好不用全局变量.

解决方案 »

  1.   

    uses
        syncobjs;Lock:TCriticalSection;
      

  2.   

    还有一个问题
    我在主线程中用SUSPEND方法挂起子线程后用RESUME唤醒,似乎不起作用.
    假如RESUME唤醒线程后是从哪里开始执行?
    是不是EXECUTE方法的第一行代码开始?
      

  3.   

    定义一个criticalsection, 不管主线程还是子线程在访问数组前entercriticalsection, 访问后leavecriticalsection. 这样就可以了
      

  4.   

    在Delphi线程对象中创建时会有一个逻辑参数,让你选择是否挂起。要注意调用SUSPEND和RESUME是有计数的。如果调用了两次Suspend,那么就要调用两次Resume唤醒。还有对于TThread对象的EXECUTE方法是执行完了线程也就结束了,在默认的Thread属性中如果EXECUTE执行完了,TThread对象会自己释放,如果再去访问这个线程对象会出非法内存访问错误。在使用EXECUTE方法时一般都使用循环,只有在需要线程结束时才推出循环,这点要注意。一般格式为:
    while Terminated do
    begin
      //执行代码
    end;
    这么写可以使用TThread的Terminate方法退出线程,若不这样写需要修改Terminate方法。
      

  5.   

    对不起
    while Terminated do
    begin
    //执行代码
    end;
    这个写错了应该是
    while not Terminated do
    begin
    //执行代码
    end;
      

  6.   

    还有一个问题
    我在主线程中用SUSPEND方法挂起子线程后用RESUME唤醒,似乎不起作用.
    假如RESUME唤醒线程后是从哪里开始执行?
    是不是EXECUTE方法的第一行代码开始?------------
    suspent后 肯定是不会被执行到的,而resume后 是表示它可以被执行 但是不一定被执行到..
    这个不敢保证的.
      

  7.   

    Idle_(阿呆)兄说的没错。criticalsection 就是临界区。
     要不用delphi自己的方法也行。
     delphi创建Thread的时候总是给每一
     个Thread创建一个子窗体。当你的进程
     调用的这个Thread的时候,朱窗体就
     用sendmessage发给子窗体信息,
      当操作返回时,子窗体释放
    。也就是将子线程挂起了。
      //详见delphi深度历险。