delphi7 多线程和计时器的问题

我做了一个简单的多线程的小程序,包括一个主窗口和一个Thread组件(就是在菜单的Newitems里的Threadobject),效果要达到由计时器Timer控制两个线程... 我做了一个简单的多线程的小程序,包括一个主窗口和一个Thread组件(就是在菜单的New items里的Thread object),效果要达到由计时器Timer控制两个线程轮换工作一定的时间片段,但是无论我怎么设置临界区,都只有一个线程工作到底,然后就提示拒绝访问,请高人帮忙看看问题出在哪
首先是主窗体:
unit frmmain_Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;

type
Tfrmmain = class(TForm)
BitBtn1: TBitBtn;
Edit1: TEdit;
Edit2: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
cs:TRTLCriticalSection;
end;

var
frmmain: Tfrmmain;

implementation
uses testthread_Unit2;
{$R *.dfm}
var
th1,th2:testthread;
flag:integer =0;

procedure Tfrmmain.Timer1Timer(Sender: TObject);
begin
if flag=0 then
begin
th2.Suspend;
th1.Resume;
flag:=1;
end
else if flag=1 then
begin
th1.Suspend;
th2.Resume;
flag:=0;
end;
end;

procedure Tfrmmain.BitBtn1Click(Sender: TObject);
begin
InitializeCriticalSection(cs);
if timer1.Enabled=false then
begin
bitbtn1.Caption:='停止';
timer1.Enabled:=true;
end
else
begin
bitbtn1.Caption:='执行';
timer1.Enabled:=false;
th1.Terminate;
th2.Terminate;
end;
end;

procedure Tfrmmain.FormCreate(Sender: TObject);
begin
th1:=testthread.Create(true);
th2:=testthread.Create(true);
th1.txt:=Edit1;
th2.txt:=Edit2;
end;
end.

下面是线程代码:
unit testthread_Unit2;

interface

uses
Classes,StdCtrls,SyncObjs,windows;

type
testthread = class(TThread)
private
{ Private declarations }
protected
procedure giveresult();
procedure Execute; override;
public
txt: TEdit;
result:integer;
end;

implementation
uses frmmain_Unit1,Sysutils;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure testthread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ testthread }

//cs:TRTLCriticalSection;
procedure testthread.giveresult();
begin
txt.Text:=IntToStr(result);
end;

procedure testthread.Execute;
var
i:integer;
begin
for i:=1 to 2000 do
begin
EnterCriticalSection(frmmain.cs); //进入临界段
if terminated then break;
result := i;
Synchronize(GiveResult);
LeaveCriticalSection(frmmain.cs); //退出临界段
end;

end;

end.
错误信息是:Thread Error :拒绝访问。(5)
展开
 我来答
mit1208
2010-12-27 · TA获得超过2347个赞
知道大有可为答主
回答量:2743
采纳率:0%
帮助的人:1899万
展开全部
begin
for i:=1 to 2000 do
begin
EnterCriticalSection(frmmain.cs); //进入临界段
if terminated then break;
result := i;
Synchronize(GiveResult);
LeaveCriticalSection(frmmain.cs); //退出临界段
end;

你这段代码就是让线程执行完一会再执行一个呀.
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式