有两个函数 funA,funB 和一个全部变量gfunA 是线程里的方法,该方法对变量g有做修改funB 是主程序里的方法,该方法在进入的时间创建了线程A现在我想做的效果是,怎么让全局变量 g等于某一值时或执行时间大于10秒时funB函数才执行完毕并返回另一个值
我目前想到的办法比较笨拙在函数funB里 设置一个死循环
while ( true )
begin
sleep(100);
if g = 100 then
break;
application.ProcessMessages;
end;
result := true;这样做造成的效果是界面卡住了,虽然能做一些简单的操作,但是界面不能关闭退出
我目前想到的办法比较笨拙在函数funB里 设置一个死循环
while ( true )
begin
sleep(100);
if g = 100 then
break;
application.ProcessMessages;
end;
result := true;这样做造成的效果是界面卡住了,虽然能做一些简单的操作,但是界面不能关闭退出
是 funB 是主程序里的方法,该方法在进入的时候创建了线程A
主程序中做一个消息响应函数,收到该消息后就做相应的动作
I: Integer;
result := false;
I := 10 * 1000 div 100;
while ( true )
begin
sleep(100);
if g = 100 then
break;
application.ProcessMessages;
Dec(I);
if I<= 0 then begin
Exit;
end;
end;
result := true;
上面的几位都说用信号量,还有小和说发消息就可以了,我都不知道这个怎么做,能否给我一个简单的例子,在我下面的代码里更改也可以var sum:Integer;type
TTLSThread = class(TThread)
private
protected
procedure Execute; override;
public
constructor Create();
end;procedure SetShowStr();
var
i,j:integer;
begin
for i := 0 to 999999 do
begin
for j := 0 to 9999 do
sum := j;
end;
end;constructor TTLSThread.Create();
begin
inherited Create(False);
end;procedure TTLSThread.Execute;
begin
FreeOnTerminate := True;
SetShowStr();
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
TTLSThread.Create();
while ( true ) do //等待sum的值被改变
begin
Sleep(100);
Application.ProcessMessages;
if sum >=9999 then
break;
end;
ShowMessage(IntToStr(sum));
end;
break;
这里不是已经可以跳出循环了吗
可能是还没明白我的意思,我是想最好的效果是在循环的时候能随时退出来,而不是非得等到一定时间或者 sum >=9999 的时候才退出来//比如说我有一个函数funB
function funB;Boolean
begin
result := false;
TTLSThread.Create(); //创建一个线程(该线程是在做一个数据收发的事情,变量g存放的是一个数据包的大小) 。。 if g >100 then //如果数据包大于100个就退出
result := true;
end;//现在别人调用我的函数就可以直接这样做 if funB then
showMessage('收到的包数已经达到100个');//而在 if funB then 这行代码执行的时候,他要能随时都可以退出来?
僵哥的这个方法已经达到了我想要的效果,Delphi里的发消息和上面几位说的使用信号量我搞Delphi一年多了却还是不懂,等手上的项目完了一定要好好学一下,不懂的再来发贴问你们吧,下午下班前结贴,看看有没有其他的答案。
忽略了一个问题,僵哥给的办法只是在主窗体里才有效果,因为Application 是相对于整个程序来说的,现在我只是一个子模块上使用方法funB还是退不出来
因为这个函数funB是要给别人调用,能不能不设置 CloseFlag ?有没有其他更好的办法?