//先谢谢大哥们了!
一、关于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;
解决方案 »
- 关于 adoquery 批量提交问题
- 请问开发简单功能网络版进销存软件能要多少钱?
- 如何从delphi的form中延伸一下?
- 有点难度的问题:明明指定了parent,却还报错"has no parent window" !
- 中间层ADO连ODBC失败,急!
- 如何改变DBgrid每行被选中时的颜色?
- 如何把日期转为16进制数据
- 请问为什么我用DBEDIT运行的时候不能往里输入数据呢?它的readonly属性为false啊, 还有什么原因呢?另外enabled为true啊
- 请教:delphi如何通过web proxy的NTLM 身份验证?
- 怎样与telnet应用服务程序通信
- 帮我看看这段程序,运行修改密码的时候总提示无法将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循当中不停地调用它,并且给了一个中间的阻塞时间,从而产生了间隔。