Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Convertir desde Delphi a C++Builder

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

Hola compañeros....

Yo tengo problemas con algo que estoy pasando desde Delphi a C++Builder ... yo lo hice y no me funcionó...
La translación mía compila... pero no responde correctamente.

No la coloco porque puedo cercenar la forma de pensar de los que me pueden ayudar...
//-------------------------------------------------------------
//Parte 1
TBufferEntries = ^Pointer;

TBoundedBuffer = class
private
FBufInit: boolean;
FBufSize: integer;
FBuf: TBufferEntries;
FReadPtr,FWritePtr: integer;
FEntriesFree, FEntriesUsed: THandle;
FCriticalMutex: THandle;
FEntryCountFree, FEntryCountUsed: integer;
protected
procedure SetSize(NewSize: integer);
function ControlledWait(Semaphore: THandle): boolean;
public
procedure ResetState;
destructor Destroy; override;
function PutItem(NewItem: Pointer): boolean;
function GetItem: Pointer;
function GetEntriesFree(var Free: integer): boolean;
function GetEntriesUsed(var Used: integer): boolean;
published
property Size: integer read FBufSize write SetSize;
end;

implementation
//-------------------------------------------------------------
//Parte 2
procedure TBoundedBuffer.SetSize(NewSize: integer);
begin
if FBufInit then ResetState;
if NewSize < 2 then NewSize := 2;
FBufSize := NewSize;
GetMem(FBuf, Sizeof(Pointer) * FBufSize);
FillMemory(FBuf, Sizeof(Pointer) * FBufSize, 0);
FCriticalMutex := CreateMutex(nil, false, nil);
WaitForSingleObject(FCriticalMutex, INFINITE);
FBufInit := true;
FEntriesFree := CreateSemaphore(nil, FBufSize - 1, FBufSize, nil);
FEntriesUsed := CreateSemaphore(nil, 0, FBufSize, nil);
FEntryCountFree := FBufSize - 1;
FEntryCountUsed := 0;
ReleaseMutex(FCriticalMutex);
if (FCriticalMutex = 0)
or (FEntriesFree = 0)
or (FEntriesUsed = 0) then ResetState
end;
//-------------------------------------------------------------
//Parte 3
procedure TBoundedBuffer.ResetState;
begin
if FBufInit then
begin
WaitForSingleObject(FCriticalMutex, DefaultWaitTime);
FBufInit := false;
FBufSize := 0;
FreeMem(FBuf);
ReleaseSemaphore(FEntriesUsed, 1, nil);
ReleaseSemaphore(FEntriesFree, 1, nil);
CloseHandle(FEntriesFree);
CloseHandle(FEntriesUsed);
ReleaseMutex(FCriticalMutex);
CloseHandle(FCriticalMutex);
end;
end;

Las he dividido para que me puedan responder por partes .. para que sea más fácil de pasar ...

gracias a todos por su valiosísima colaboración!!!!!

joseluisbz@bigfoot.com

Volver arriba
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

//Sin compilar.

//1ª Parte

#include <windows.h>

typedef char ** TBufferEntries;

class TBoundedBuffer
{
private :
bool FBufInit;
int FBufSize;
TBufferEntries FBuf;
int FReadPtr, FWritePtr;
HANDLE FEntriesFree, FEntriesUsed;
HANDLE FCriticalMutex;
int FEntryCountFree, FEntryCountUsed;

protected:
void SetSize(int NewSize);
bool ControlledWait(HANDLE Semaphore);

public :
void ResetState(void);
virtual ~TBoundedBuffer();
bool PutItem(void *NewItem);
void *GetItem(void);
bool GetEntriesFree(int &Free);
bool GetEntriesUsed(int &Used);

__published:
__property int Size={read=FBufSize, write=SetSize};
};


//2ª Parte

void TBoundedBuffer::SetSize(int NewSize)
{
if(FBufInit)
ResetState();
if(NewSize < 2)
NewSize = 2;
FBufSize = NewSize;
FBuf=new(void *)[FBufSize];
memset(FBuf, 0x00, sizeof(void *)*FBufSize);
FCriticalMutex = CreateMutex(NULL, false, NULL);
WaitForSingleObject(FCriticalMutex, INFINITE);
FBufInit = true;

FEntriesFree = CreateSemaphore(NULL, FBufSize - 1, FBufSize, NULL);
FEntriesUsed = CreateSemaphore(NULL, 0, FBufSize, NULL);
FEntryCountFree = FBufSize - 1;
FEntryCountUsed = 0;
ReleaseMutex(FCriticalMutex);
if ((FCriticalMutex = 0)| |(FEntriesFree = 0)| |(FEntriesUsed = 0))
ResetState();
}


//3ª Parte

void TBoundedBuffer::ResetState(void)
{
if(FBufInit)
{
WaitForSingleObject(FCriticalMutex, DefaultWaitTime);
FBufInit = false;
FBufSize = 0;
delete(FBuf);
ReleaseSemaphore(FEntriesUsed, 1, NULL);
ReleaseSemaphore(FEntriesFree, 1, NULL);
CloseHandle(FEntriesFree);
CloseHandle(FEntriesUsed);
ReleaseMutex(FCriticalMutex);
CloseHandle(FCriticalMutex);
}
}

Volver arriba
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

La única diferencia con tu código radica aquí :
En la segunda parte
FBuf = new (void*)[FBufSize];
memset(FBuf,0x00,sizeof(void*)*FBufSize);


donde en vez de eso yo utilicé
FBuf = new void*[FBufSize];
SysCopyMem (No recuerdo pero algo similar)

La idea es que obtuve los mismos resultados....
De todas foirmas muchísimas gracias.....

Volver arriba
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

Hola:

El pedazo de código es solo una parte de una unidad de un total de cinco.

Específicamente crea un arreglo de apuntadores para almacenar punteros, en total cuatro que es el valor de FBufSize.

Estos punteros son con el fin de pasar datos en una relación productor-consumidor de manera asíncrona.

El motivo de tanto código es que se manejan secciones críticas, ya sea creándolas con CreateMutex o con CreateSemaphore... y por supuesto destruyéndolas con sus funciones respectivas.

O.k.!

Volver arriba
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

Podrias decir que es lo que hace el código?, asi puedes ayudar a la gente a comprenderlo mejor, y sobretodo que aprendan. Gracias
a ver si en futuros trozos de codigo la gente pone lo que hace sino en el topic en la pregunta. Para que a los demás le pueda servir tambien.
Volver arriba
Mensaje    Asunto: Convertir desde Delphi a C++Builder Responder citando

Ah, ya está todo claro, jajajaaj
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.