求助:C++代码转到Delphi,主要涉及文件和字符操作(100分)

  • 主题发起人 主题发起人 uuid
  • 开始时间 开始时间
U

uuid

Unregistered / Unconfirmed
GUEST, unregistred user!
将下面代码转到Delphi:
int PLAYER_write(int handle, unsigned char*buffer,int size ,unsigned int waitTime);
FILE* in;
HANDLE begin
PlayEvent;
bool begin
=false;
bool discardData=false;
HANDLE hInputThread;
DWORD WINAPI inputThreadFunc(LPVOID lpParam)
{
char buf[80000];
int number=fread(buf,1 ,642,in);
int count=0;
WaitForSingleObject(begin
PlayEvent,-1);
ResetEvent(begin
PlayEvent);
for(int j=0;j<1000;j++)
{
while(number&amp;&amp;
begin
)
{
int count = number;
int size;
unsigned char* ptr = (unsigned char*)buf;
while(count)
{
size = PLAYER_write(playerId, ptr, count, -1);
count -= size;
ptr= ((unsigned char*)buf) + size;
if(!begin
)break;
}
if(discardData)
{
fread(buf,1,1,in);
discardData=false;
}
number=fread(buf,1,1000,in);
}
fseek(in,642,SEEK_SET);
number=fread(buf,1,1000,in);
if(!begin
)break;
}
return 1;
}
char fileName[128];
in=fopen(fileName,"rb");
if(in)...
begin
PlayEvent=CreateEvent(NULL,true,false,NULL);
DWORD dwThreadId;
hInputThread=CreateThread(NULL,0,inputThreadFunc,0,0,&amp;dwThreadId);
 
太长,可以先自己翻,有不明白的地方再问。
 
function PLAYER_write(handle:Integer;
buffer:pCHAR;
size:Integer;
waitTime:ULONG): integer;
hFile: Integer;

begin
PlayEvent: THandle;
begin
ning: Boolean = False;
discardData: Boolean = False;
hInputThread: THandle;
function inputThreadFunc: DWORD;

var
buf: array[1..80000] of char;

number: Integer;
count: Integer;
j: Integer;
size: Integer;
ptr: PCHAR;
begin
number := FileRead(hFile, buf, 642);
count := 0;
WaitForSingleObject(begin
PlayEvent, 0);

ResetEvent(begin
PlayEvent);
for j := 1 to 1000do
begin
while (number > 0) and begin
ningdo

begin
count := number;
ptr := @buf;
while count > 0do
begin
size := AVE6KPLAYER_write(playerId, ptr, count, 0);
count := count - size;

ptr := @buf;
ptr := ptr + size;
if not begin
ning then
break;
end;
if discardData then
begin
FileRead(hFile, buf, 1);

discardData := False;
end;
number := FileRead(hFile, buf, 1000);
end;
FileSeek(hFile, 642, 0);
number := FileRead(hFile, buf, 1000);
if not begin
ning then
break;
end;
result := 1;
end;

fileName: string;
dwThreadId: DWORD;
hFile := FileOpen(fileName, fmOpenRead);

if hFile > 0 then
...
begin
PlayEvent := CreateEvent(nil, True, False, nil);
hInputThread := CreateThread(nil, 0, @inputThreadFunc, nil, 0, dwThreadId);
上面的代码在我的程序中能够通过编译。但我的程序运行起来这部分还有问题。
原来的C++程序运行正常。
CreateEvent,CreateThread包含在init例程中,而在另一个例程start中
包含SetEvent(begin
PlayEvent);
正确的执行顺序是先init,再start,从而开始play。
但是我改过来的程序执行起来是init后就开始play,好像无需start。
我对线程编程一无所知,不知是不是这方面的问题。
另外,不知道文件操作、字符类型定义有没有问题。
 
ptr := @buf;
改成 ptr := @buf[1];
 
WaitForSingleObject(begin
PlayEvent, 0);
是不等待(等待0秒)
而原程序中的WaitForSingleObject(begin
PlayEvent,-1);是永久等待(若事件不被set)
应改回-1
这正是你“init后就开始play,好像无需start。”的原因。应该在“另一个例程start中
包含SetEvent(begin
PlayEvent);”,这样就对了。
 
但是在Delphi中WaitForSingleObject(begin
PlayEvent,-1);这一句编译时报错:
constant expression violates subrange bounds
 
WaitForSingleObject(begin
PlayEvent,INFINITE);
INFINITE = DWORD($FFFFFFFF);
,其实就是-1
 
非常感谢zw4611
 
接受答案了.
 
后退
顶部