【发布时间】:2014-12-11 09:45:39
【问题描述】:
线程被等待链部分中的消息阻塞 “在线程 xxxxx 拥有的关键部分上阻塞” 如果我在创建线程后给睡眠,它们运行良好。 不知道为什么他们在关键部分被阻止 关键部分没有太多代码。任何人都可以帮助解决这个问题。
我的线程执行方法有一个全局变量,它位于关键部分,如下所示
procedure TMyThread.Execute();
Var
Filename : String;
FIleDone : Boolean;
begin
inherited;
FIleDone := False;
while not FIleDone do //while there are still files
begin
try
EnterCriticalSection(CriticalSection); //Try to catch the critical section
//Access the shared variables
//Are there still files available
if FileList.Count = 0 then
begin
//Leave the critical section, when there are no files left
LeaveCriticalSection(CriticalSection);
//Leave the while loop
FIleDone := true;
self.Terminate;
break;
end
else
begin
//Read the filename
Filename := FileList.Strings[0];
//Delete the file from the list
FileList.Delete(0);
//Leave the critical section
LeaveCriticalSection(CriticalSection);
CopyTable(ChangeFileExt(filename,''),Form1.TargetDir.Text);
end;
except
LeaveCriticalSection(CriticalSection);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15 : TMythread;
TimeThen: TDateTime;
TimeNow: TDateTime;
Counter,id1,id2 : Integer;
begin
TimeThen := now;
FileList := TStringList.create();
if Length(TargetDir.Text) > 1 then
if TargetDir.Text[Length(TargetDir.Text)] <> '\' then
TargetDir.Text := TargetDir.Text + '\';
GetFileStringList(TargetDir.Text + '*.db', FileList);
ProgressBar.Max := FileList.Count;
t1 := TMyThread.create(false);
//sleep(1000);
t2 := TMyThread.create(false);
//sleep(1000);
t3 := TMyThread.create(false);
//sleep(1000);
t4 := TMyThread.create(false);
//sleep(1000);
t5 := TMyThread.create(false);
//sleep(1000);
t6 := TMyThread.create(false);
//sleep(1000);
t7 := TMyThread.create(false);
//sleep(1000);
t8 := TMyThread.create(false);
//sleep(1000);
t9 := TMyThread.create(false);
//sleep(1000);
t10 := TMyThread.create(false);
//sleep(1000);
t11 := TMyThread.create(false);
//sleep(1000);
t12 := TMyThread.create(false);
//sleep(1000);
t13 := TMyThread.create(false);
//sleep(1000);
t14 := TMyThread.create(false);
//sleep(1000);
//t15 := TMyThread.create(false);
// sleep(1000);
//mythread.Execute;
while Done < 14 do
begin
progressBar.Position := ProgressBar.Max - FileList.Count;
Application.ProcessMessages;
end;
// end;
//ProgressBar.Position := ProgressBar.Position + 1;
//end;
//ChangeCOCompanyLegalName();
TimeNow := Now;
if ((TimeNow - TimeThen) * 24 * 60 * 60) < 60 then
ShowMessage('done in ' + FormatFloat('###',((Now - TimeThen) * 24 * 60 * 60)) + ' seconds')
else
if ((TimeNow - TimeThen) * 24 * 60) < 60 then
ShowMessage('done in ' + FormatFloat('###.00',((Now - TimeThen) * 24 * 60)) + ' minutes')
else
ShowMessage('done in ' + FormatFloat('###.00',((Now - TimeThen) * 24)) + ' hours');
//FileList.Free;
end;
【问题讨论】:
标签: multithreading delphi-2009