C
cyradg
Unregistered / Unconfirmed
GUEST, unregistred user!
创建多个线程,用以下代码创建:
for i :=0 to thrdnum-1do
begin
g_Event :=CreateEvent(nil, True, False, nil);
//同步事件
FThreads :=CreateThread(nil,0,@Scan_ThreadProc,Pointer(i),0,tID);
end;
线程执行代码是:
function Scan_ThreadProc(lpParamointer)WORD;stdcall;
begin
while truedo
begin
//开始访问全局数据
EnterCriticalSection(g_CS);
//遇到这些标志就退出线程序
if (tcpscan.FTerminated) or (tcpscan.FsIPNum >=tcpscan.FIPScanNum) then
begin
SetEvent(g_Event[eventid]);//在此处设置段点根本就不会执行
LeaveCriticalSection(g_CS);
Result :=0;
exit;
end;
//结束访问全局数据
LeaveCriticalSection(g_CS);
..........//其他代码
//开始访问全局数据
EnterCriticalSection(g_CS);
.............//又访问全局变量
//结束访问全局数据
LeaveCriticalSection(g_CS);
.......//其他代码
//开始访问全局数据
EnterCriticalSection(g_CS);
.............//又访问全局变量
//结束访问全局数据
LeaveCriticalSection(g_CS);
end
以上是线程内部代码框架,如果不去主动想结束它,不论是运行1个线程还是运行多个线程,都不会出现问题并且都会主动结束
但是通过设置FTerminated变量来主动让线程结束就出现问题了,以下是结束线程代码片段:
//开始访问全局数据
EnterCriticalSection(g_CS);
//不加也没有用
FTerminated :=true;
//设置退出线程标志
//结束访问全局数据
LeaveCriticalSection(g_CS);
//不加也没有用
p :=@g_Event;
//事件数组
while n>0do
begin
if n>MAXIMUM_WAIT_OBJECTS then
_count :=MAXIMUM_WAIT_OBJECTS
else
_count :=n;
//在WaitForMultipleObjects处死掉了
wThrd :=WaitForMultipleObjects( _count , PWOHandleArray(p) , TRUE , INFINITE );
if wThrd<>WAIT_FAILED then
begin
for i :=0 to _count-1do
begin
CloseHandle(PWOHandleArray(p)^);
end;
end;
Dec(n,MAXIMUM_WAIT_OBJECTS);
p :=Ptr(Integer(p)+MAXIMUM_WAIT_OBJECTS*sizeof(THandle));
end;
当执行到WaitForMultipleObjects时候,挂了,事实1个线程也是这样,因为1个线程好调试,事实上,线程序内部的
那句SetEvent(g_Event[eventid])根本就不执行,好象哪里锁定了,请问问题出在哪里,谢谢.
for i :=0 to thrdnum-1do
begin
g_Event :=CreateEvent(nil, True, False, nil);
//同步事件
FThreads :=CreateThread(nil,0,@Scan_ThreadProc,Pointer(i),0,tID);
end;
线程执行代码是:
function Scan_ThreadProc(lpParamointer)WORD;stdcall;
begin
while truedo
begin
//开始访问全局数据
EnterCriticalSection(g_CS);
//遇到这些标志就退出线程序
if (tcpscan.FTerminated) or (tcpscan.FsIPNum >=tcpscan.FIPScanNum) then
begin
SetEvent(g_Event[eventid]);//在此处设置段点根本就不会执行
LeaveCriticalSection(g_CS);
Result :=0;
exit;
end;
//结束访问全局数据
LeaveCriticalSection(g_CS);
..........//其他代码
//开始访问全局数据
EnterCriticalSection(g_CS);
.............//又访问全局变量
//结束访问全局数据
LeaveCriticalSection(g_CS);
.......//其他代码
//开始访问全局数据
EnterCriticalSection(g_CS);
.............//又访问全局变量
//结束访问全局数据
LeaveCriticalSection(g_CS);
end
以上是线程内部代码框架,如果不去主动想结束它,不论是运行1个线程还是运行多个线程,都不会出现问题并且都会主动结束
但是通过设置FTerminated变量来主动让线程结束就出现问题了,以下是结束线程代码片段:
//开始访问全局数据
EnterCriticalSection(g_CS);
//不加也没有用
FTerminated :=true;
//设置退出线程标志
//结束访问全局数据
LeaveCriticalSection(g_CS);
//不加也没有用
p :=@g_Event;
//事件数组
while n>0do
begin
if n>MAXIMUM_WAIT_OBJECTS then
_count :=MAXIMUM_WAIT_OBJECTS
else
_count :=n;
//在WaitForMultipleObjects处死掉了
wThrd :=WaitForMultipleObjects( _count , PWOHandleArray(p) , TRUE , INFINITE );
if wThrd<>WAIT_FAILED then
begin
for i :=0 to _count-1do
begin
CloseHandle(PWOHandleArray(p)^);
end;
end;
Dec(n,MAXIMUM_WAIT_OBJECTS);
p :=Ptr(Integer(p)+MAXIMUM_WAIT_OBJECTS*sizeof(THandle));
end;
当执行到WaitForMultipleObjects时候,挂了,事实1个线程也是这样,因为1个线程好调试,事实上,线程序内部的
那句SetEvent(g_Event[eventid])根本就不执行,好象哪里锁定了,请问问题出在哪里,谢谢.