{注意哦,你的两个线程用的同一个变量装它们的句柄,这样是不对地,出错地原因是因为循环 *** 作可视控件的时候,如果不排队,会出现同时访问的情况,最好是可以使用类的方式来使用线程}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
// procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hloopHandle:Thandle ; //线程 句柄
dloopThreadID:DWORD ; //线程 id
//================
lpHandles:Thandle;
lpTheradID:DWORD;
function doloop(P:pointer):Longint;stdcall;
Function StartEvent(S:pointer):Longint;stdcall;
implementation
{$R dfm}
//按钮一
procedure TForm1Button1Click(Sender: TObject);
begin
hloopHandle:= CreateThread(nil,0,@doloop,nil,0,dloopThreadID);
if hloopHandle=0 then
begin
messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
abort;
end;
end;
//按钮二
procedure TForm1Button2Click(Sender: TObject);
begin
lpHandles:= CreateThread(nil,0,@StartEvent,nil,0,lpTheradID);
if lpHandles=0 then
begin
messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
abort;
end;
end;
//线程处理函数一
function doloop(P:pointer):integer;stdcall;
var
i:integer;
begin
for i:=0 to 100000 do
begin
form1Edit1Text:=inttostr(i);
sleep(100);
end;
end;
//==================================
//线程处理函数二
Function StartEvent(S:pointer):integer;stdcall;
var
c:integer;
begin
for c:=0 to 100000 do
begin
form1Edit2Text:=inttostr(c);
sleep(100);
end;
end;
end
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hloopHandle:Thandle ; //线程 句柄
dloopThreadID:DWORD ; //线程 id
function doloop(P:pointer):Longint;stdcall;
implementation
{$R dfm}
//启动线程处理
procedure TForm1Button1Click(Sender: TObject);
begin
hloopHandle := CreateThread(nil,0,@doloop,nil,0,dloopThreadID);
if hloopHandle=0 then
begin
messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
abort;
end;
end;
//终止线程
procedure TForm1Button2Click(Sender: TObject);
begin
if hloopHandle<>0 then
TerminateThread(hloopHandle,dloopThreadID);
end;
//线程处理函数
function doloop(P:pointer):Longint;stdcall;
var
i:integer;
begin
for i:=0 to 10000 do
begin
form1Edit1Text:=inttostr(i);
end;
end;
end
1。通过线程的互斥来同步 *** 作数据库 2。数据库采用事务处理表中的数据 3。采用共享方式打开数据库,不是以独占方式打开数据库 建立一个mysql连接表加上一个临界区,表结点是这样的(mysqlcon,bool),根据实际情况定大校我用的是10个连接。
Createthread(nil, 0, @MyThreadFun, @p, 0, Id); // 创建线程,注意这里不是阻塞的,启动线程后就直接执行下一句代码了
memo1Text:=som; // 执行时上面那个线程可能还没执行结束
你可以理解为,线程中的代码和 memo1这句是同时执行的,所以som的结果并不可预知
thread := Createthread(nil, 0, @MyThreadFun, @p, 0, Id);
WaitForSingleObject(thread) // 等待线程执行结束
memo1Text:=som; // 这样就对了,但失去了多线程的意义
以上就是关于Delphi多线程问题全部的内容,包括:Delphi多线程问题、求DELPHI多线程例程、如何在Delphi开发环境中实现多线程的数据查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)