5
52253831
Unregistered / Unconfirmed
GUEST, unregistred user!
[gold][h1]程序描述:[/h1][/gold]
一个项目需要对一批数据(存入数组)进行多种方式的处理,本人做法使用多线程调用同一个过程分区域处理(同时另开一线程进行进度监控),而处理的方法采用DLL完成(一种处理方法我做了一个DLL)。程序开始时读所有DLL中处理函数的入口供多线程中调用。程序重点部份如下:
[red][h3]全局变量描述[/h3][/red]type
oPlugin =Function(Sourstrchar):integer;stdcall;
TSortArray =array of string;
type FMoudle=record
Name :string;
//动态链接库处理方式说明
Moudle:THandle;
//该动态链接库的载入名柄
PFunc Plugin;
//动态链接库中的处理函数程序入口
end;
Var
Max_Thread :integer;
//单个线程处理的数据行数
Thread_N :integer;
//使用的线程数
Max_Conn :int64;
//需处理数据的最大行
Conn :int64;
//当前正在处理的数据行(供进度进程使用)
Number :array of string;
//等待处理的数据数组
F_Moudle :array of FMoudle;//动态链接库中的各种处理方式函数的程序入口
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,inifiles;
type
File_Number = class(TThread)
private
bMemo : TMemo;
Start_ID : int64;
//本线程处理的开行号
protected
procedure Execute;override;
public
constructor Create(ID:int64;Memo: TMemo);
end;
implementation
uses mem;
Var CS:TRTLCriticalSection;
//定义全局临界区
constructor File_Number.Create(ID:int64;Memo: TMemo);
begin
Start_ID:=ID;
bMemo :=Memo;
initializeCriticalSection(CS);
FreeOnTerminate := True;
inherited Create(False);
end;
procedure File_Number.Execute;
var
i,j,T :integer;
End_ID :int64;
begin
EnterCriticalSection(CS);
//进入临界区
End_ID:=start_ID+max_thread-1;
if End_ID>Max_Conn then
End_ID:=Max_Conn;
for i:=start_ID to End_IDdo
begin
inc(Conn);
for j:=0 to high(F_Moudle)do
T:=F_Moudle[j].PFunc(pchar(number));
end;
if Conn>=Max_Conn then
bMemo.Lines.Add(inttostr(start_ID) + '至 '+ inttostr(end_ID) + '共' + inttostr(conn));
LeaveCriticalSection(CS);
//退出临界区
end;
[h4]主程序中在这里调用上述多线程[/h4]procedure TForm1.Button2Click(Sender: TObject);
var
i :integer;
begin
conn :=0;
Ref_Statu.Create(ProgressBar1,Memo1);
/启动进度监控进程
for i:=1 to Thread_Ndo
File_Number.Create((i-1)*Max_Thread+1,Memo1);
/启动多个处理线程
end;
[gold][h1]问题情况:[/h1][/gold]1、当使用一个线程进行处理时,无论数据行有多少行任何异常情况发生,
2、当需处理的数据行较多时,处理中会发生多线程锁死情况,进度条不会进到100%,此时CPU 100%,中断查看全局CONN小于MAX_Conn,此时只对进度条线程中断有作用,对处理部份下中断不起作用,主程序所属的线程还有4-5个没退出。
搞不明白这是什么原因。
一个项目需要对一批数据(存入数组)进行多种方式的处理,本人做法使用多线程调用同一个过程分区域处理(同时另开一线程进行进度监控),而处理的方法采用DLL完成(一种处理方法我做了一个DLL)。程序开始时读所有DLL中处理函数的入口供多线程中调用。程序重点部份如下:
[red][h3]全局变量描述[/h3][/red]type
oPlugin =Function(Sourstrchar):integer;stdcall;
TSortArray =array of string;
type FMoudle=record
Name :string;
//动态链接库处理方式说明
Moudle:THandle;
//该动态链接库的载入名柄
PFunc Plugin;
//动态链接库中的处理函数程序入口
end;
Var
Max_Thread :integer;
//单个线程处理的数据行数
Thread_N :integer;
//使用的线程数
Max_Conn :int64;
//需处理数据的最大行
Conn :int64;
//当前正在处理的数据行(供进度进程使用)
Number :array of string;
//等待处理的数据数组
F_Moudle :array of FMoudle;//动态链接库中的各种处理方式函数的程序入口
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,inifiles;
type
File_Number = class(TThread)
private
bMemo : TMemo;
Start_ID : int64;
//本线程处理的开行号
protected
procedure Execute;override;
public
constructor Create(ID:int64;Memo: TMemo);
end;
implementation
uses mem;
Var CS:TRTLCriticalSection;
//定义全局临界区
constructor File_Number.Create(ID:int64;Memo: TMemo);
begin
Start_ID:=ID;
bMemo :=Memo;
initializeCriticalSection(CS);
FreeOnTerminate := True;
inherited Create(False);
end;
procedure File_Number.Execute;
var
i,j,T :integer;
End_ID :int64;
begin
EnterCriticalSection(CS);
//进入临界区
End_ID:=start_ID+max_thread-1;
if End_ID>Max_Conn then
End_ID:=Max_Conn;
for i:=start_ID to End_IDdo
begin
inc(Conn);
for j:=0 to high(F_Moudle)do
T:=F_Moudle[j].PFunc(pchar(number));
end;
if Conn>=Max_Conn then
bMemo.Lines.Add(inttostr(start_ID) + '至 '+ inttostr(end_ID) + '共' + inttostr(conn));
LeaveCriticalSection(CS);
//退出临界区
end;
[h4]主程序中在这里调用上述多线程[/h4]procedure TForm1.Button2Click(Sender: TObject);
var
i :integer;
begin
conn :=0;
Ref_Statu.Create(ProgressBar1,Memo1);
/启动进度监控进程
for i:=1 to Thread_Ndo
File_Number.Create((i-1)*Max_Thread+1,Memo1);
/启动多个处理线程
end;
[gold][h1]问题情况:[/h1][/gold]1、当使用一个线程进行处理时,无论数据行有多少行任何异常情况发生,
2、当需处理的数据行较多时,处理中会发生多线程锁死情况,进度条不会进到100%,此时CPU 100%,中断查看全局CONN小于MAX_Conn,此时只对进度条线程中断有作用,对处理部份下中断不起作用,主程序所属的线程还有4-5个没退出。
搞不明白这是什么原因。