procedure TSysChatMainForm.TTestNetTimer(Sender: TObject);
begin
if InternetGetConnectedState(nil, 0) = false then
begin
Data.UserOff('[脱机]',false);
bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
end;
end;
对多线程不了解,想请教下:如何把上面用Timer控件做的定时检测改成多线程形式?每3秒执行一次程序关闭应如何释放此线程等?
begin
if InternetGetConnectedState(nil, 0) = false then
begin
Data.UserOff('[脱机]',false);
bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
end;
end;
对多线程不了解,想请教下:如何把上面用Timer控件做的定时检测改成多线程形式?每3秒执行一次程序关闭应如何释放此线程等?
很久以前研究过,差不多都忘了,百度吧
不过这些都不是精确方法,只是一个概念时间
执行线程程序前,将timer的Enable=false
线程程序执行完后,timer的Enable=true至于释放的问题,和你用timer前一样。
但存在一个问题,如楼上所说,不是太精确,但基本上还可以。比如设10秒,一般不会变成20秒,呵呵。
//先写一个函数 用来检测
function myThread(p:pointer):boolean;stdcall;
begin
while ( 终止条件) do
begin
sleep(3000);
{检测代码}
end;
end;
{然后创建这个线程}
CreateThread(nil,0,@myThread,nil,0,id);在窗体destroy 里面 把终止条件写上,等待线程结束 退出程序
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.