如果只有一个CPU,多线程提高不了速度和效率;
解决方案 »
- 下面汉字转拼音函数是从网络下载的,很好,能将“滕钰鑫炜”等生僻字的声母都能转换出来,但是,“旸”等字却无法转换。请帮助修改一下!
- 为什么我的delphi7 应用程序运行不了?? 急。急。
- ???????????????????*自定义过程问题*??????????????
- clientsocket中如何发送以下数据?
- 求助
- bit 类型字段显示问题
- InstallShield Express 3.53 注册机?
- 详细设计的讨论
- 求助:一个非常奇怪的问题,用了 dipose() ,反而不行了,这是为什么啊?谢谢!
- 关于报表问题--新手
- 如何利用image作一个动画按钮?100分
- 在DELPHI中怎样制作程序的菜单?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, Db;
const
WM_OPENDATASET = WM_USER + 1;
WM_EXECUTESQL = WM_USER + 2;
type
TThreadDataSet = class(TThread)
private
procedure WMOpenDataSet(Msg: TMsg);
procedure WMExecSQL(Msg: TMsg);
protected
procedure Execute; override;
public
procedure Open(DataSet: TDataSet);
procedure ExecSQL(DataSet: TDataSet);
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FThread : TThreadDataSet;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TThreadDataSet.ExecSQL(DataSet: TDataSet);
begin
PostThreadMessage(ThreadID, WM_EXECUTESQL, Integer(DataSet), 0);
end;
procedure TThreadDataSet.Execute;
var
Msg : TMsg;
begin
FreeOnTerminate := True;
PeekMessage(Msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
while not Terminated do begin
if GetMessage(Msg, 0, 0, 0) then
case Msg.Message of
WM_OPENDATASET: WMOpenDataSet(Msg);
WM_EXECUTESQL: WMExecSQL(Msg);
end;
end;
end;
procedure TThreadDataSet.Open(DataSet: TDataSet);
begin
PostThreadMessage(ThreadID, WM_OPENDATASET, Integer(DataSet), 0);
end;
procedure TThreadDataSet.WMExecSQL(Msg: TMsg);
var
Qry : TQuery;
begin
try
Qry := TQuery(Msg.wParam);
try
Qry.Open;
except
Qry.ExecSQL;
end;
except
On E: Exception do
ShowMessage(E.Message);
end;
end;
procedure TThreadDataSet.WMOpenDataSet(Msg: TMsg);
var
Ds : TDataSet;
begin
try
Ds := TDataSet(Msg.wParam);
Ds.Open;
except
On E: Exception do
ShowMessage(E.Message);
end;
end;
// --------------------------------------- //
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TThreadDataSet.Create(False);
FThread.Open(Table1); // Opening a dataset (table or query)
FThread.ExecSQL(Query1); // Executing a SQL
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FThread.Terminate;
end;
end. -----------------------------------------------------------------------------