//先谢谢大哥们了!
一、关于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;
一、关于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;
解决方案 »
- 怎么取消DELPHI的自动重命名控件的功能?
- 如何把颜色为32位的图像转成颜色为16位的图像
- 怎么得到光标在控件上的相对位置?
- 编写一个数据库的程序(C/S)的用哪个工具好?
- 请问如何将jpeg图像缩小保存(包括尺寸和质量)
- 关于链接外部应用程序的问题
- 如何编写一个程序,让本地硬盘的某个目录执行完全共享???
- 气死我了,QQ被盗,有那位朋友帮我给弄回来吗小弟感激不尽,并有高分相送!!!!!
- 怎么会有两种类型的TBrush?
- form的free方法和close方法有什么不同呢?
- 帮我看看这段程序,运行修改密码的时候总提示无法将Null插入Class(表中属性),改列不允许空值,Insert失败。我没用Insert啊
- sqlserver并发取最大单据号
1-2 是使用同一个内存管理器;
1-3 具体看是出现了什么问题,主进程当中的函数跟DLL当中的函数是同一级别的,并没有太大的差异性,但是需要注意的是,当内存被释放之后,相关的指针将不再允许访问,否则会因为访问了野指针,而造成内存错乱。2-1 应设计而定,都可以,但是线程更具独立性
2-2 这里不是通知,而是线程需要判断是否程序需要退出。当进程退出就会激活一个退出事件,此时线程就可以感应到。这样的好处是当你在线程当中创建的众多线程,在主线程当中不需要理会,直接通过一个事件就可以完成所有线程的退出。否则的话,就需要一个一个地Terminate,那样就不得不记录下创建了哪些线程,销毁了哪些线程。
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是系统每隔一定周期主动触发的,从而可以以事件标识为依据做定时条件,我这么说对吗?再次谢谢僵哥~
2.主线程退出进行SetEvent之后,其实QuitEvent就一直是wrSignaled,也必须让它一直保持为wrSignaled的。主线程就不需要进行等待,除非有某些内存是分派给子线程使用,而必须在主线程当中收回的,这种得另案处理。
3.WaitFor本身没有所谓的周期,只是因为你的线程在一个while循当中不停地调用它,并且给了一个中间的阻塞时间,从而产生了间隔。