//先谢谢大哥们了!
一、关于DLL的问题
用Exe调用DLL
问题:
1.二者是否在一个进程空间内
2.加上ShareMem后,二者是否共用一个内存管理器
3.如果2成立,在Exe中为什么不能释放在DLL国创建对象所用的内存
二、关于线程同步的问题(利用事件通知机制)
//这段代码的意思是每1分钟创建一个线程,让线程去工作
问题:
1.用Timer控件不也可以用定时触发来创建线程吗,为什么要用事件通知呢?
2.事件通知怎么就能达到定时器的效果,说白了就是看不懂WaitFor的意思!var
  QuitEvent: TEvent;procedure TThread.Execute;
begin
 case QuitEvent.WaitFor(10) of  // make sure it's not time to quit already
    wrSignaled, wrAbandoned: Terminate;
  end;  while not Terminated do
  begin
    MainTimerProc;//是创建线程的过程
    case QuitEvent.WaitFor(PushIntervalMs) of//PushIntervalMs为每隔多长时间
      wrSignaled, wrAbandoned: Terminate;
      wrTimeOut, wrError: ; // do nothing
    end;
  end;
end;initialization
  QuitEvent := TEvent.Create(nil,true,false,'MonitorQuitEvent');
finalization
  QuitEvent.Free;

解决方案 »

  1.   

    1-1 是在同一个进程内(以API的方式调用);
    1-2 是使用同一个内存管理器;
    1-3 具体看是出现了什么问题,主进程当中的函数跟DLL当中的函数是同一级别的,并没有太大的差异性,但是需要注意的是,当内存被释放之后,相关的指针将不再允许访问,否则会因为访问了野指针,而造成内存错乱。2-1 应设计而定,都可以,但是线程更具独立性
    2-2 这里不是通知,而是线程需要判断是否程序需要退出。当进程退出就会激活一个退出事件,此时线程就可以感应到。这样的好处是当你在线程当中创建的众多线程,在主线程当中不需要理会,直接通过一个事件就可以完成所有线程的退出。否则的话,就需要一个一个地Terminate,那样就不得不记录下创建了哪些线程,销毁了哪些线程。
      

  2.   

    先谢谢僵哥,不知道CSDN怎么搞的,想向您提问,但专家列表中不能写您!
      

  3.   

    问题:
    1.主线程退出时,生成的工作线程不自动退出吗?还要主动通知它们退出?2.我在主线程退出时,需要对退出事件进行SetEvent,使事件变为wrSignaled,而后在主线程中进行循环,每隔1分钟对事件进行扫描,如果发现事件状态变为wrSignaled,则中止主线程,如果没有,隔一个周期生成一个线程,以此类推,是这样的吗?
    case QuitEvent.WaitFor(10) of  // make sure it's not time to quit already 
        wrSignaled, wrAbandoned: Terminate; 
      end;while not Terminated do 
      begin 
        MainTimerProc;//是创建线程的过程 
        case QuitEvent.WaitFor(PushIntervalMs) of//PushIntervalMs为每隔多长时间 
          wrSignaled, wrAbandoned: Terminate; 
          wrTimeOut, wrError: ; // do nothing 
        end; 
      end;
    3.WaitFor是系统每隔一定周期主动触发的,从而可以以事件标识为依据做定时条件,我这么说对吗?再次谢谢僵哥~
      

  4.   

    1. 理论上是只要主线程结束,进程也就中止了,那么子线程也就没有了。但是在Delphi当中,会有一个后续的回收处理过程,如果子线程没有完全退出的话,那个最终的回收过程是无法完成的。
    2.主线程退出进行SetEvent之后,其实QuitEvent就一直是wrSignaled,也必须让它一直保持为wrSignaled的。主线程就不需要进行等待,除非有某些内存是分派给子线程使用,而必须在主线程当中收回的,这种得另案处理。
    3.WaitFor本身没有所谓的周期,只是因为你的线程在一个while循当中不停地调用它,并且给了一个中间的阻塞时间,从而产生了间隔。