for i := 1 to 15 do
begin
repeat with TshdThread.Create() do
OnTerminate := ThreadDone;
inc(ThreadRunning); until threadRunning=maxthread; //showmessage('aa'); end;
begin
repeat with TshdThread.Create() do
OnTerminate := ThreadDone;
inc(ThreadRunning); until threadRunning=maxthread; //showmessage('aa'); end;
你的问题主要是由于满足条件后
执行了死循环
repeat
until
导致主线程进入死循环,以至于不能处理Windows消息
var
MaxThread : integer;
i : integer;
begin
okbtn.Enabled := false; ThreadRunning := 0; //应是全局变量,在ThreadDone 中应将此值减1
MaxThread := 4;
// ThreadFull := false; for i := 1 to 15 do
begin
inc(ThreadRunning);
with TshdThread.Create() do
begin
OnTerminate := ThreadDone;
end; while threadRunning mod maxthread = 0 do
Application.ProcessMessages(); end;
okbtn.Enabled := true;
end;
while ThreadRunning=MaxThread do
Application.ProcessMessages();解决了问题!380是你的了!由于一次只能给100分,所以请搜索你的名字,我用别的贴子来给你分。 别的同志也有!不过还请你指教,对ThreadRunning为什么要同步?如何同步?什么叫函对函数?临界区能否给个简单例子?
initialization
InitializeCriticalSection(cs);
finalization
DeleteCriticalSection(cs);使用
EnterCriticalSection(cs);LeaveCriticalSection(Cs);
EnterCriticalSection(cs);
//访问共享变量
LeaveCriticalSection(Cs);
之间,这样就可以保证同步了!
定义全局变量g_CriticalSection := TCriticalSection.Create; 建立临界区(使用之前要建立,整个程序中只须建立一次)
g_CriticalSection := TCriticalSection.Create;
函数中读写前用
g_CriticalSection.Enter; //进入临界区函写后用
g_CriticalSection.Leave; //离开临界区
最后要释放整个程序中只须释放一次
if g_CriticalSection <> nil then FreeAndNil(g_CriticalSection);关于监界区,信号量,事件对象等内核对象的作用及使用方法,你可以参考相关的资料, 一般书上讲多线程的地方都会讲的,因为多线程一般是不可避免要用同步的.祝你进步!
var
g_CriticalSection : TCriticalSection;uses部分要加入 SyncObjs;
var
MaxThread : integer;
i : integer;
begin
okbtn.Enabled := false; ThreadRunning := 0;
MaxThread := 4;
ThreadFull := false; hr := CreateSemaphore(nil,MaxThread,MaxThread,nil);//建最多4个信号
for i := 1 to 15 do
begin
WaitForSingleObject(hr,INFINITE);///减少一个
showmessage('aa');
with TshdThread.Create() do OnTerminate := ThreadDone;
end;
okbtn.Enabled := true;
end;procedure TOKBottomDlg.ThreadDone(Sender: TObject);
begin
label10.Caption := inttostr(RegSucc);
Dec(ThreadRunning);
end;你还要在线程TshdThread结束的地方加一句:
ReleaseSemaphore(hr,1,nil);///增加一个