延时时间的同时计算一个变量的值,当绝对时间到期,变量的值被求出,如何实现,是否用多线程?(100分)

  • 主题发起人 主题发起人 flyupwards
  • 开始时间 开始时间
F

flyupwards

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题如下:
延时时间(毫秒级)的同时计算一个变量的值,当绝对时间到期,变量的值被求出,如何实现,是否用多线程?
比如,我想计算300 ms 这么长的时间内,机器的变量值会从1加到多少?是否用多线程来实现?
如何实现?
我希望用上gettickcount配上多线程实现,可以吗?
谢谢各位!!
perfect@inhe.net
qq:27731820
 
现有两个线程:一个是:
var
From,Now:Longint;
begin
From:=GetTickCount;
repeat
Application.ProcessMessages;
synchronize(RefreshLabel);
Now:=GetTickCount;
until(Now-From>=300);
StopFlag:=True;
end;

另一个是:
 repeat
iCount:=iCount+1;
until (iCount>=iMax);
我的问题是:
一、下面我用这种方法执行多线程是否对?
Test1:=TSysRun.Create;
Test2:=TVarAdd.Create(9000000);
Test1.Execute;
Test2.Execute;
Test1.OnTerminate:=SysRunDone;
Test2.OnTerminate:=VarAddDone;
其中:
procedure TForm1.SysRunDone(Sender : TObject);
begin
Test1.StopFlag:=True;
end;
procedure TForm1.VarAddDone(Sender : TObject);
begin
Test1.StopFlag:=True;
end;

二、我想求出当第一个线程把时间走完以后,第二个线程中的变量所求出
最后的值是多少?(iCount=?),上述作法不行,我怎么办?
谢谢各位!!

 
通过线程1 创建线程2,在线程1中计算时间,到时间杀掉线程2得到想要的数
 
根本不用那么烦。。直接用time 控件控制时间就可以
你不是要求 延时时间(毫秒级)的同时计算一个变量的值,
当绝对时间到期,变量的值被求出
在 延迟的时候执行 timer事件
timer 事件中写 你计算的数就行了。。
给你个简单的例子。。。。。。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Spin;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Timer1: TTimer;
SpinEdit1: TSpinEdit;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
x: integer;
implementation

{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
i:= Listbox1.ItemIndex;
i:= i+x;
if i=Listbox1.Count-1 then
x:=-1;
if i=0 then
x:=1;
ListBox1.ItemIndex:= i;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=1;
Timer1.Interval:= SpinEdit1.Value;
Timer1.Enabled:= not Timer1.Enabled;
if Timer1.Enabled then
Button1.Caption:= '停止'
else
begin
Button1.Caption:= '开始';
Label1.Caption:= ListBox1.Items.Strings[ListBox1.ItemIndex];
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Value:= Timer1.Interval;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Button1.SetFocus;
end;

end.

我感觉这样就能解决你现在的问题。。根本不用线程也可以
 
用gettickcount就可以了,何必用多线程,在两次gettickcount之间进行你要的操作
循环就可以了,当然有点误差,你只要精确到ms可以忽略不计。
 
后退
顶部