代码如下
按钮的代码:
var
i,ti:integer;
begin
label1.Caption:=inttostr(memo1.Lines.Count);
if bool then //只创建一次,免得让程序出错
begin
aa:=0;
i:=memo1.Lines.Count; //先要知道有多少个地址
setlength(Taa,i); //然后就分配一下内存空间,让线程能够占用内存来执行;
for Ti:=0 to i do
begin
Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
Taa[ti].OnTerminate:= abcxd;
end;
end;
bool:=false;
end;
线程的代码
/////////////////////////////////////////////////////////
constructor Tss.Create(aa:string);
begin
strurl :=aa; // 接收传递过来的地址
FreeOnTerminate := True; // 自动删除
InitializeCriticalSection(CS);
inherited Create(False); // 直接运行
end;procedure Tss.datamemo;
begin
form1.Memo2.Lines.Add(strurl);
end;procedure Tss.Execute;
begin
{ Place thread code here }
EnterCriticalSection(cs);
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
form1.Memo2.Lines.Add('地址出现错误');
LeaveCriticalSection(CS);
end;
//////////////////////////////////////////////到底是哪里出错了。。为什么会弹出那一个操作尼?
按钮的代码:
var
i,ti:integer;
begin
label1.Caption:=inttostr(memo1.Lines.Count);
if bool then //只创建一次,免得让程序出错
begin
aa:=0;
i:=memo1.Lines.Count; //先要知道有多少个地址
setlength(Taa,i); //然后就分配一下内存空间,让线程能够占用内存来执行;
for Ti:=0 to i do
begin
Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
Taa[ti].OnTerminate:= abcxd;
end;
end;
bool:=false;
end;
线程的代码
/////////////////////////////////////////////////////////
constructor Tss.Create(aa:string);
begin
strurl :=aa; // 接收传递过来的地址
FreeOnTerminate := True; // 自动删除
InitializeCriticalSection(CS);
inherited Create(False); // 直接运行
end;procedure Tss.datamemo;
begin
form1.Memo2.Lines.Add(strurl);
end;procedure Tss.Execute;
begin
{ Place thread code here }
EnterCriticalSection(cs);
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
form1.Memo2.Lines.Add('地址出现错误');
LeaveCriticalSection(CS);
end;
//////////////////////////////////////////////到底是哪里出错了。。为什么会弹出那一个操作尼?
解决方案 »
- C定义函数DLL的调用转化为delphi的调用
- deliph连接数据库
- 如何能列举出安装的全部网络协议,EnumProtocols在DELPHI中的参数如何声明?
- **********************************************一个关于用qrepot打印的问题,在线等待 当场给分********************************
- 关于输入法的编程(100分)
- 一个程序员的命运是否能够改变,就看各位了(急)
- ServerSocket只要open就报错,什么原因?
- 今天的“国家计算机软件资格水平考试”高级程序员试题泄密
- 小妹子有一问题不明白:dll中能放QUERY等控件不?如果可以,如何把查询的结果传到程序中的dbgrid中?
- 请问在Delphi中如何使用二进制!
- 我学DELPHI不久!有个问题!
- 如休做到这样的效果?
type TMyEvent = procedure(sender:TObject;msg:string) of object; Tmythread = class(tthread)
private
FmyEvent : TMyEvent;
procedure helloword(const msg:string);
published
property OnEvent:TMyEvent read FmyEvent write FmyEvent;
end; procedure Tmythread.(const msg:string);
begin
if assigned(OnEvent) then
OnEvent(this,msg);
end;//应用程
type
TForm1 = class(tform)
mmo1:tmemo;
private
procedure ReceiveEvent(sender:TObject;msg:string);
end; procedure TForm1.ReceiveEvent(sender:TObject;msg:string);
begin
mmo1.lines.add(msg) ;
end; //启动线程
dd := Tmythread.create;
dd.onEvent := ReceiveEvent;
begin
{ Place thread code here }
EnterCriticalSection(cs);
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
form1.Memo2.Lines.Add('地址出现错误');
LeaveCriticalSection(CS);
end; 这一段改成:
procedure Tss.ShowError;
begin
form1.Memo2.Lines.Add('地址出现错误');
end;procedure Tss.Execute;
begin
{ Place thread code here }
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
Synchronize(ShowError);
end;已经加了Synchronize,没必要再用互斥量。
你在操作文件吗?确保这个文件没有被其它线程占用.
1.调用临界区对象的AQUIRE后,直接修改全局变量,然后在调用临界区对象RELEASE;
2.发个消息给主线程的窗体,告诉它有新的数据,主线程从读取全局变量并清空;(注意要调用临界区对象哦)
或许有哪一位朋友能贴一个关于操作多个线程的实例看看.我现在把贴子加到一百分
setlength(Taa,i); //然后就分配一下内存空间,让线程能够占用内存来执行;
for Ti:=0 to i do //这儿应该是i-1,改成 for Ti:=0 to i-1 do begin
Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程 上面是你的部分代码
begin
Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
Taa[ti].OnTerminate:= abcxd;
end;
这个应该是 for Ti:=0 to i-1 do 吧?
这样直接操作控件总感觉不太好,最好用事件的方式通知.
procedure Tss.Execute;
begin
{ Place thread code here }
EnterCriticalSection(cs);
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
form1.Memo2.Lines.Add('地址出现错误');
LeaveCriticalSection(CS);
end;
form1.Memo2.Lines.Add这一句不一定非要直接操作Memo2,
而是声明一个事件,当出现错误的时候触发这个事件。而主窗体创建该线程的时候,写个方法绑定该线程的事件。
在该窗体的方法中去实现具体的代码,这样做的好处是线程不依赖任何窗体,保证线程的独立性。
Classes,Windows;type
Tss = class(TThread)
private
strurl:string;
procedure datamemo;
function checkurl(url:string):boolean;
procedure AddressError;
protected
procedure Execute; override;
public
constructor Create(aa:string);
end;implementation{ Tss }
uses unit1;
procedure Tss.AddressError;
begin
form1.Memo2.Lines.Add('地址出现错误');
end;function Tss.checkurl(url: string): boolean;
begin
result:=true;
end;constructor Tss.Create(aa:string);
begin
strurl :=aa; // 接收传递过来的地址
FreeOnTerminate := True; // 自动删除
inherited Create(False); // 直接运行
end; procedure Tss.datamemo;
begin
form1.Memo2.Lines.Add(strurl);
end; procedure Tss.Execute;
begin
{ Place thread code here }
//EnterCriticalSection(cs);
if checkurl(strurl) then //如果地址存在的话
Synchronize(DataMemo) //就同步执行的添加操作
else
Synchronize(AddressError);
//LeaveCriticalSection(CS);
end;
end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,uTss;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure abcxd(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
b:boolean=true;
aa:integer;
Taa:array of Tss;
CS:TRTLCriticalSection;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
i,ti:integer;
begin
label1.Caption:=inttostr(memo1.Lines.Count);
if b then //只创建一次,免得让程序出错
begin
aa:=0;
i:=memo1.Lines.Count; //先要知道有多少个地址
setlength(Taa,i); //然后就分配一下内存空间,让线程能够占用内存来执行;
for Ti:=0 to i-1 do
begin
Taa[ti]:=Tss.Create(memo1.Lines[ti]); //创建数组线程
Taa[ti].OnTerminate:= abcxd;
end;
end;
b:=false;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//InitializeCriticalSection(CS);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//deletecriticalsection(CS);
end;procedure TForm1.abcxd(Sender: TObject);
begin
//
end;end.