多线程定时执行程序怎么写?
procedure TSysChatMainForm.TTestNetTimer(Sender: TObject);
begin
if InternetGetConnectedState(nil, 0) = false then
begin
Data.UserOff('[脱机]',false);
bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
end;
end;
对多线程不了解,想请教下:如何把上面用Timer控件做的定时检测改成多线程形式?每3秒执行一次
程序关闭应如何释放此线程等?
------解决方案--------------------方法很多,用getticketcount,sleep或者CreateWaitableTimer
很久以前研究过,差不多都忘了,百度吧
不过这些都不是精确方法,只是一个概念时间
------解决方案--------------------简单的做法是
执行线程程序前,将timer的Enable=false
线程程序执行完后,timer的Enable=true
至于释放的问题,和你用timer前一样。
但存在一个问题,如楼上所说,不是太精确,但基本上还可以。比如设10秒,一般不会变成20秒,呵呵。
------解决方案--------------------你这个用timer足以了,如果用线程,TThread,以及api的创建线程等都可以,具体自己搜去吧
------解决方案--------------------
Delphi(Pascal) code
//先写一个函数 用来检测
function myThread(p:pointer):boolean;stdcall;
begin
while ( 终止条件) do
begin
sleep(3000);
{检测代码}
end;
end;
------解决方案--------------------
Delphi(Pascal) code
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TSysChatMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FTestNetThread: TThread;
public
{ Public declarations }
end;
var
SysChatMainForm: TSysChatMainForm;
implementation
{$R *.dfm}
type
TTestNetThread = class(TTHread)
procedure Execute; override;
procedure RefreshUIInMainThread;
end;
{ TTestNetThread }
procedure TTestNetThread.RefreshUIInMainThread;
begin
bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
end;
procedure TTestNetThread.Execute;
begin
inherited;
FreeOnTerminate := True;
while (not Terminated) and (not InternetGetConnectedState(nil, 0)) then
begin
Data.UserOff('[脱机]',false);
Synchronize(RefreshUIInMainThread);
Sleep(3000)
end;
end;
{ TSysChatMainForm }
procedure TSysChatMainForm.FormCreate(Sender: TObject);
begin
FTestNetThread := TTestNetThread.Create(False);
end;
procedure TSysChatMainForm.FormDestroy(Sender: TObject);
begin
FTestNetThread.Terminate;
end;
end.