首页
社区
课程
招聘
[求助][求助]写了一个很艰难的程序,多线程同步延迟导致线程无法正常退出(delphi 线程错误5)
发表于: 2013-7-6 17:50 6788

[求助][求助]写了一个很艰难的程序,多线程同步延迟导致线程无法正常退出(delphi 线程错误5)

2013-7-6 17:50
6788
写的很艰难
大概描述下
程序主体是一个DLL
被其他进程注入到进程A
热键HOME的时候可以呼出界面。
然后在按钮1事件之后启动三个线程,
每个线程都要用到两个资源
为了保证同步我使用了 临界区。
因为调用很频繁
为了保证 CPU不卡,在临界区代码使用了delay1()。

procedure Delay1(mS :integer); 
var
beginTick ,endTick :Integer; 

begin
beginTick :=GetTickCount;   
  while True do  
   begin     
      Application.ProcessMessages;      
  end
    Tick :=GetTickCount;      
sleep(1);    
if (endTick - beginTick)>mS then   Break;   
   end; 
end; 


然后 在按钮2事件之后,停止3个线程,
为了保证线程正常退出 我在 多处代码段 添加了
               
if Terminated then               
begin                 
break;                
end; 


我的调用临界资源代码是

 EnterCriticalSection(Myps); //进入临界区             
try             
proone(@get.z);                  
    if Terminated then                
    begin                
    break;                 
end;              
   Delay1(15);             
finally             
  LeaveCriticalSection(Myps); //离开临界区             
end; 




错误的提示 是 thread ERROR:拒绝访问 (5);
查过资料  确认应该是 临界区的问题。
这个程序写的好艰难啊
如何处理 多线程 临界区正常的 退出,不要出现 线程错误这样的问题了
感谢了 。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
2
如果只是对一个简单变量Terminated进行操作的话,使用微软同步机制中的Interlocked打头的一系列函数应该足够了,当然前提是在同一进程空间内,不必使用临界区这种开销比较大的机制。
2013-7-8 09:19
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
不是那么简单的。
主线程 9个时钟 3个线程
资源有读写资源 调用资源 还有其他类型的。
Interlocked多线程同步能用上么?
2013-7-8 12:48
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你这表达的没看懂,码贴上来。
2013-7-10 13:52
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
线程中为什么不用sleep 确用Application.ProcessMessages?
2013-7-10 13:53
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
线程中不能直接访问VCL
2013-7-10 13:55
0
雪    币: 264
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这里有一文,你看看。
http://andy.jgknet.de/blog/bugfix-units/asynccalls-29-asynchronous-function-calls/
2013-7-10 14:02
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
8
问题已经解决了,是我代码写的不合理
2013-7-11 10:18
0
游客
登录 | 注册 方可回帖
返回
//