新人求助!!!!!!!!!!!!!!!
delphi吧
全部回复
仅看楼主
level 1
xdxdxd111222 楼主
创建两个线程,一个线程打印aa,一个线程打印bb,必须保证每打印两个aa之后打印一个bb。打印完10个aa和5个bb后退出程序,有没有老哥讲解一下啊,线程挂起与激活那两个过程好像不能用了,不知道该怎么操作了
2017年10月24日 06点10分 1
吧务
level 14
用临界区就足够了
2017年10月24日 08点10分 2
level 1
xdxdxd111222 楼主
是吗,我用临界区搞了半天搞出来了,但是不符合要求,因为我设置了一个全局变量来进行两个进程间的通信,主要是不知道该在哪设置临界区,循环外还是循环内,
2017年10月25日 03点10分 3
level 8
打印机本来就是单线程堵塞式的,你两个线程交替打印有个毛用,一个线程 记数交替执行 A B
2017年10月26日 01点10分 4
[大拇指]
2017年10月26日 09点10分
level 9
多简单啦,一个全局变量,再用个定时器,例如500毫秒,将全局变量从1加到15,两线程sleep(1)之后检查全局变量,=1,2时打印aa, =3时打印bb,依次进行。
要注意的是,=1时会检查好多次,但是只能做一次打印动作。
不过,这个方法肯定不够正规。
2017年10月26日 12点10分 5
level 1
xdxdxd111222 楼主
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls,SyncObjs,ExtCtrls;
type
TmyThreadA = class(TThread)
private
{ Private declarations }
protected
procedure Execute;override;
procedure PrintA;
procedure Run;
end;
TmyThreadB = class(TThread)
private
{ Private declarations }
protected
procedure Execute;override;
procedure PrintB;
procedure Run;
end;
TForm3 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
FThreadPrintA:TmyThreadA; //声明打印aa的线程
FThreadPrintB:TmyThreadB; //声明打印bb的线程
MyEventA:THandle; //声明打印aa线程的事件
MyEventB:THandle; //声明打印bb线程的事件
implementation
{$R *.dfm}
procedure TmyThreadA.PrintA;
var
I:Integer;
begin
I := 0;
while I<5 do
begin
if WaitForSingleObject(MyEventA, INFINITE) = WAIT_OBJECT_0 then //等待打印aa的事件
begin
Synchronize(Run);
Inc(I);
SetEvent(MyEventB); //启动打印bb的事件
ResetEvent(MyEventA); //暂停打印aa的事件
end;
end;
end;
procedure TmyThreadB.PrintB;
var
I:Integer;
begin
I := 0;
while I<5 do
begin
if WaitForSingleObject(MyEventB, INFINITE) = WAIT_OBJECT_0 then //等待打印bb的事件
begin
Synchronize(Run);
//Form3.Memo1.Lines.Add('bb');
Inc(I);
ResetEvent(MyEventB); //暂停打印bb的事件
SetEvent(MyEventA); //启动打印aa的事件
end;
end;
end;
procedure TmyThreadA.Run;
begin
Form3.Memo1.Lines.Add('aa');
Form3.Memo1.Lines.Add('aa');
end;
procedure TmyThreadB.Run;
begin
Form3.Memo1.Lines.Add('bb');
end;
procedure TmyThreadA.Execute;
begin
PrintA;
end;
procedure TmyThreadB.Execute;
begin
PrintB;
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
CloseHandle(MyEventA); {如果已经创建过}
MyEventA := CreateEvent(nil, True, True, nil); //创建事件A
CloseHandle(MyEventB); {如果已经创建过} //创建事件B
MyEventB := CreateEvent(nil, True, False, nil);
FThreadPrintA := TmyThreadA.create(False); //创建线程A
FThreadPrintB := TmyThreadB.create(False); //创建线程B
end;
procedure TForm3.Timer1Timer(Sender: TObject);
begin
FThreadPrintA.Free;
FThreadPrintB.Free;
CloseHandle(MyEventA);
CloseHandle(MyEventB);
Form3.close();
end;
end.
2017年10月27日 01点10分 6
level 1
xdxdxd111222 楼主
搞出来了,用了两个事件对象来控制两个线程
2017年10月27日 01点10分 7
level 7
一个全局变量搞定,何必那么麻烦
2017年11月16日 14点11分 8
要求就是要求啊,要得不是结果,别人要求就是,要用线程
2017年11月17日 01点11分
1