一个多线程的问题(200分)

  • 主题发起人 主题发起人 boclif
  • 开始时间 开始时间
B

boclif

Unregistered / Unconfirmed
GUEST, unregistred user!
c/s 方式通信,服务器采用多线程接受客户端的请求后需要播出一断声音,我想按接受请求的先
后顺序来顺序播放,不知该如何来写,我是新手,最好有源码及说明,谢谢!!!。
 
既然有先后,又何必用多线程。

总觉得你得问的太简单,要求的太高。抱歉。
 
同意楼上,这样不用多线程的,
 
是不是处理的时间很长?
想开个线程。
找本书看看,在delphi里头实现简单
 
在服务器端使用TQueue来缓存客户请求系列,然后简单了,FIRST IN FIRST OUT ->即先后播放。
用不着多线程。至于要源代码,编程就得多自己写。好运。
 
to 刘李子 ,到哪里找TQUEUE的相关资料,看了半天帮助也没有看明白
 
实在不行用TList也可以, 每次只要播放第0个就可以个,播完删除
 
给个EMAIL邮箱,专门做了一个DEMO送给你。
//一个TForm,一个TLabel,三个TButton,一个TMemo,一个TMediaPlayer,一个TTimer
//在当前目录下建个子目录wav,
//子目录wav下放五个声音文件:user1.wav、
user2.wav、
user3.wav、
user4.wav、
user5.wav
//编码如下:

unit Unit1;

interface

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

const
WM_COMEON_PLAYMYSOUND = WM_USER + 1122; //自定义消息

MAX_USERS_LIST =5;// 256; //客户要求队列最大容量

type
TUserInfo = record //定义此结构可扩展性增强
SoundID:DWORD;
end;
PUserInfo = ^TUserInfo;

type
TForm1 = class(TForm)
Memo1: TMemo;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
MediaPlayer1: TMediaPlayer;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
FRequestQueue:TQueue;
FPreviousSoundEndPlaying:Boolean;
procedure WMCOMEONPLAYMYSOUND(var msg:TMessage);message WM_COMEON_PLAYMYSOUND;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.WMCOMEONPLAYMYSOUND(var msg:TMessage); //自定义消息处理
var
P:PUserInfo;
begin
if FRequestQueue.Count < MAX_USERS_LIST then
begin

New(P);
P^.SoundID := msg.wParam;
FRequestQueue.Push( P );

Memo1.Lines.Add('Client request has been push into the Queue :) -> [ Client No.'+IntToStr(msg.wParam)+' ]');
end
else
memo1.Lines.Add('Users list is full, message''s been ignored!');
end;

procedure TForm1.Button3Click(Sender: TObject); //模拟客户请求
var
I,J:Integer;
begin
for J:=0 to 9 do
begin
I:=random(5); if I = 0 then I:=1;
SendMessage(Handle,WM_COMEON_PLAYMYSOUND,I,0);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FRequestQueue:=TQueue.Create;
FPreviousSoundEndPlaying:=True; //初始化为前一个播放已经到结尾,即可以播放下一个
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FRequestQueue.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
FNPlaySound:TFileName;

SID:DWORD;

P:PUserInfo;

begin
if FPreviousSoundEndPlaying then
begin
if FRequestQueue.Count > 0 then
begin
FPreviousSoundEndPlaying:=False;
///////////////////////////////////////////////////////////////////////
P:=FRequestQueue.Pop; //按顺序播放客户请求
SID:=P^.SoundID;
Dispose(P);
///////////////////////////////////////////////////////////////////////
FNPlaySound:=ExtractFilePath(Application.ExeName )+'wav/user'+IntToStr(SID)+'.wav';
with MediaPlayer1 do
begin
FileName:=FNPlaySound;
Open;
Play;
Memo1.Lines.Add('Playing '+FileName+' ...');
end;
end;
end
else
begin
with MediaPlayer1 do
begin
FPreviousSoundEndPlaying:= Position = Length;
if FPreviousSoundEndPlaying then
begin
Close;
Memo1.Lines.Add('Stop.');
Memo1.Lines.Add('==========================================');
end;
end;
end;
end;

end.

 
非常感谢,EMAIL to :boclif@sina.com
 
后退
顶部