写了一个艰难的程序,多线程同步延迟导致线程无法正常退出
写的很艰难
大概描述下
程序主体是一个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;
if Terminated then
begin
break;
end;
EnterCriticalSection(Myps); //进入临界区
try
proone(@get.z);
if Terminated then
begin
break;
end;
Delay1(15);
finally
LeaveCriticalSection(Myps); //离开临界区
end;
感谢了 。 多线程 临界区?线程错误?拒绝访问5
[解决办法]
用信号量来处理这种问题,需要线程处理时候设置信号量。
参考CreateEvent、SetEvent、ResetEvent、WaitforSingleObject
另外不要阻塞主线程,然后再其他线程中Application.ProcessMessages
[解决办法]
Application.ProcessMessages;
线程里面的不要用,这个是依赖消息的.
首先VCL的Application就不能用于多线程,
其次这个是依赖消息的,消息队列是依附于线程的,本来Application处理的应该是主线程的消息,你这样一来就乱套了