写了一个艰难的程序,多线程同步延迟导致线程无法正常退出
写的很艰难
大概描述下
程序主体是一个DLL
被其他进程注入到进程A
热键HOME的时候可以呼出界面。
然后在按钮1事件之后启动三个线程,
每个线程都要用到两个资源
为了保证同步我使用了 临界区。
因为调用很频繁
为了保证 CPU不卡,在临界区代码使用了delay1()。
procedure Delay1(mS :integer);
var
beginTick ,endTick :Integer;
begin
beginTick :=GetTickCount;
while True do
begin
Application.ProcessMessages;
endTick :=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;
问题的关键是 这样的代码 如果Delay1(15); 时间长一点比如Delay1(100); 就容易导致 效率急剧下降[因为调用很频繁 ,导致程序越来越卡]
不Delay1()的话 导致 线程始终无法正常退出。
错误的提示 是 thread ERROR:拒绝访问 (5);
查过资料 确认应该是 临界区的问题。
这个程序写的好艰难啊
大部分时间是在 调试和查错中度过的。
每次的问题 都让我 弄的一点力气都没了。
写代码写到鼠标手。老茧都出来了。求各位码农给点提示
如何处理 多线程 临界区正常的 退出,不要出现 线程错误这样的问题了
感谢了 。 多线程 临界区?线程错误?拒绝访问5
[解决办法]
用信号量来处理这种问题,需要线程处理时候设置信号量。
参考CreateEvent、SetEvent、ResetEvent、WaitforSingleObject
另外不要阻塞主线程,然后再其他线程中Application.ProcessMessages
[解决办法]
Application.ProcessMessages;
线程里面的不要用,这个是依赖消息的.
首先VCL的Application就不能用于多线程,
其次这个是依赖消息的,消息队列是依附于线程的,本来Application处理的应该是主线程的消息,你这样一来就乱套了