我正在使用VCL TCPServer组件,每次数据都会触发事件 在tcp端口上收到。在事件内,数据可用于文本 程序的参数。因为我想将这些数据保存到mysql中 数据库我想知道哪个是解决这个问题的最佳方法。 在过程中直接对收到的每个数据使用INSERT SQL命令 或者将数据存储在存储器(即TStrings)中然后调用 一个函数每X(使用Timer)分钟执行INSERT命令?
由于
答案 0 :(得分:1)
那么,
您不应该在事件中保存数据,因为在执行此操作时您将破坏组件执行流程。代替:
1 - 您可以缓冲要保存的所有数据,并且不时保存它们(不好,如果您的应用程序出现问题,您可能会丢失大量数据)。
2 - 在事件内部,创建一个将接收数据并将其保存到数据库的线程。这样您就不会破坏事件流程执行,并且您将动态保存所有数据。如果您这样做,您还将使用CPU的另一个核心。这就是我要做的。
解决方案2的代码(未经测试):
TOnError = procedure(aError : string) of object;
TSaveDataThread = class(TThread)
private
oError : string;
oOnError : TOnError;
oDataToSave : string;
procedure SaveDataToDataBase;
procedure CallOnError;
protected
procedure Execute; override;
constructor Create(aDataToSave : string); reintroduce;
public
property OnError : TOnError read oOnError write oOnError;
end;
procedure TSaveDataThread.CallOnError;
begin
oOnError(oError);
end;
constructor TSaveDataThread.Create(aDataToSave: string);
begin
inherited Create(True);
FreeOnTerminate := True;
oDataToSave := aDataToSave;
end;
procedure TSaveDataThread.Execute;
begin
inherited;
Self.SaveDataToDataBase;
end;
procedure TSaveDataThread.SaveDataToDataBase;
begin
//put here your code to save aDataToSave to the database
//set error on oError
oError := 'error';
Synchronize(CallOnError);
end;
procedure TForm5.OnError(aError: string);
begin
ShowMessage(aError);
end;
procedure TForm5.Button1Click(Sender: TObject);
var
vSaveDataThread : TSaveDataThread;
vDataToSave : string;
begin
//change this method fot the event you want to use
vDataToSave := 'this is the data that will be saved to the database';
vSaveDataThread := TSaveDataThread.Create(vDataToSave);
vSaveDataThread.OnError := Self.OnError;
vSaveDataThread.Start;
end;
如果您不了解线程,请查看此问题:Multithreading - The Delphi Way