写的很艰难
大概描述下
程序主体是一个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
大概描述下
程序主体是一个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
线程里面的不要用,这个是依赖消息的.
首先VCL的Application就不能用于多线程,
其次这个是依赖消息的,消息队列是依附于线程的,本来Application处理的应该是主线程的消息,你这样一来就乱套了
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;改为: sleep(10);
不要在临界锁里加sleep与 if Terminated then begin break; end;这个没啥意义线程退不出一般都是因为在线程里单个过程执行的时间太长了,自己检查吧。给出的这点代码看不出问题在哪