Delphi多线程问题

Delphi多线程问题,第1张

{注意哦,你的两个线程用的同一个变量装它们的句柄,这样是不对地,出错地原因是因为循环 *** 作可视控件的时候,如果不排队,会出现同时访问的情况,最好是可以使用类的方式来使用线程}

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开发环境中实现多线程的数据查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9321544.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存