我们有一个应用程序,用户可以与我们交谈,它工作正常,他创建了一个新的对话,我们聊天,没关系。但是,在开始聊天之前,他需要连接到DataSnap服务器,这就是我试图创建主题的地方。每5分钟,计时器会触发他的事件来创建线程,并尝试在服务器上进行连接,如下图所示:德尔福:通过TThread验证DataSnap连接
我的主题:
unit UThreadSnapConnection;
interface
uses
System.Classes, System.SysUtils, Data.SqlExpr;
type
TThreadSnapConnection = class(TThread)
private
FSnap: TSQLConnection;
procedure TryToConnect;
protected
procedure Execute; override;
constructor Create;
public
DMSnap: TSQLConnection;
HostName: String;
Port: String;
end;
implementation
{ TThreadSnapConnection }
constructor TThreadSnapConnection.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;
procedure TThreadSnapConnection.TryToConnect;
begin
try
FSnap := DMSnap.CloneConnection;
FSnap.Connected := False;
try
FSnap.Connected := True;
except
end;
if FSnap.Connected then
DMSnap.Connected := True;
finally
FreeAndNil(FSnap);
end;
end;
procedure TThreadSnapConnection.Execute;
begin
Synchronize(TryToConnect);
end;
end.
我的计时器:
procedure TMyDataModuleSnap.TimerSnapTimer(Sender: TObject);
var
MyThread: TThreadSnapConnection;
begin
if not(MySQLConnection.Connected) then
begin
MyThread := TThreadSnapConnection.Create;
MyThread.DMSnap := MySQLConnection;
MyThread.HostName := 'localhost';
MyThread.Port := '211';
MyThread.Resume;
end;
end;
我做的是尝试连接到服务器,如果它工作,那么它会使我的数据模块连接。
我的问题是,每次行
FSnap.Connected := True;
执行冻结1〜2秒的应用,原因我做了一个线程是不会冻结。只要我知道,它不应该打扰所有的应用程序,所以我开始想,也许这是它将Connected属性设置为True时的工作,如果它是线程或非线程,它将冻结独立。
有没有办法在尝试连接时不冻结?
这是我的第一个线程,也许我只是误解了事情,那不是线程的工作方式,但是,如果不是那么我需要知道,或者至少明白我在做什么错了。
编辑:我正在做的测试是,我启动应用程序而不启动服务器,所以它会尝试连接不成功,我的数据模块也不会连接。
您正在调用线程中的“同步(TryConnect)”。这意味着你正在连接主线程。 –
好吧,我明白你在说什么,但我认为'Synchronize'会使它与应用程序平行,就像它们两个同时运行而不会相互干扰一样。不是吗? –
不,“Synchronize”表示代码将在主线程中执行。请参见[TThread.Synchronize](http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.Synchronize)。 –