 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
joseluisbz Lt Cmdr

Registrado: 31 Ene 2003Mensajes: 101Ubicación: Medellín - Colombia de Barranquilla
|
Publicado: Vie 31 Ene, 2003 9:56 pm Asunto: TThread: Hilo se detiene y no continúa... |
|
|
Cordial saludo:
En unmensaje previo yo había colocado Hilos e Imágenes...
Bueno resulta que revisando el software que funcionaba en Cpp4 y ahora en Cpp6 no.
Le puse que mostrara avisos dentro del Método Execute del TThread.
Muestra el primero, el segundo no...
..qué me sugieren?
Gracias _________________ Please Response to:joseluisbz@bigfoot.com |
|
| Volver arriba |
|
 |
R. Porcar Site Admin

Registrado: 08 Ago 2002Mensajes: 113Ubicación: Castellón (España)
|
Publicado: Sab 01 Feb, 2003 1:24 am Asunto: |
|
|
Con las pistas que das no tengo ni idea de que puede ser.
Da mas info, a ver si me inspiro. (tampoco soy el rey del hilo, solo he hecho 4 chorradas con las llamadas al sistema en linux). |
|
| Volver arriba |
|
 |
joseluisbz Lt Cmdr

Registrado: 31 Ene 2003Mensajes: 101Ubicación: Medellín - Colombia de Barranquilla
|
Publicado: Sab 01 Feb, 2003 10:47 am Asunto: |
|
|
Hola
Inicialmente yo tenía el código así:
| Código: |
//---------------------------------------------------------------------------
__fastcall TDIProcessing::TDIProcessing(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpHigher;
FreeOnTerminate = false;
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::Execute()
{
//---- Place thread code here ----
while(!Terminated)
{
if(ProcessType == 1)
{
ColorToGrayBegin();
Synchronize(ColorToGrayEnd);
ProcessType = 0;
}
if((ProcessType != 1) && (ProcessType != 0))
{
GrayToProcessBegin();
Synchronize(GrayToProcessEnd);
ProcessType = 0;
}
Suspend();
}
|
Como dije antes esta aplicación corría en BCpp4 y ahora en BCpp6 no...
Yo me metí al hilo e hice algunos cambios para verificar ...
y quedó así:
| Código: |
//---------------------------------------------------------------------------
__fastcall TDIProcessing::TDIProcessing(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpHigher;
FreeOnTerminate = false;
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::Execute()
{
ShowMessage("ya comencé 2");
//---- Place thread code here ----
// while(!Terminated)
//{
ShowMessage("ya comencé0");
if(ProcessType == 1)
{
ColorToGrayBegin();
Synchronize(ColorToGrayEnd);
ProcessType = 0;
ShowMessage("ya comencé");
}
if((ProcessType != 1) && (ProcessType != 0))
{
GrayToProcessBegin();
Synchronize(GrayToProcessEnd);
ProcessType = 0;
}
Suspend();
//}
|
como ves, en la primera está todo normal..
Si deshabilito el ciclo While.. el hilo debería quedarse ejecutándose por siempre...
pero solo se ejecuta:
| Código: |
ShowMessage("ya comencé 2");
|
y
| Código: |
ShowMessage("ya comencé0");
|
no se está ejecutando...
Con respecto al código entero...
| Código: |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "DIProcessing.h"
#include "Main.h"
#include "SetMaskDIP.h"
#pragma package(smart_init)
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
//---------------------------------------------------------------------------
__fastcall TDIProcessing::TDIProcessing(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpHigher;
FreeOnTerminate = false;
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::Execute()
{
ShowMessage("ya comencé 2");
//---- Place thread code here ----
// while(!Terminated)
//{
ShowMessage("ya comencé0");
if(ProcessType == 1)
{
ColorToGrayBegin();
Synchronize(ColorToGrayEnd);
ProcessType = 0;
ShowMessage("ya comencé");
}
if((ProcessType != 1) && (ProcessType != 0))
{
GrayToProcessBegin();
Synchronize(GrayToProcessEnd);
ProcessType = 0;
}
Suspend();
//}
}
//---------------------------------------------------------------------------
void TDIProcessing::ColorToGrayBegin()
{
ProcessBitmapSource = new Graphics::TBitmap();
Synchronize(CatchSource);
//ProcessBitmapResult = new Graphics::TBitmap();
int MaxY = ProcessBitmapSource->Height;
int MaxX = ProcessBitmapSource->Width;
/*
ProcessBitmapResult->Height = MaxY;
ProcessBitmapResult->Width = MaxX; */
Synchronize(ProcessingMainProcessBarBegin);
float ControlMainProgressBar = MaxX/20;
COLORREF GetRGB;
int GVR,GVG,GVB; //Valores obtenidos de Rojo, Verde y Azul del Bitmap Anterior
int SVR,SVG,SVB; //Valores colocados de Rojo, Verde y Azul del Nuevo Bitmap
for (int PosX = 0; PosX < MaxX; PosX++)
{
if(PosX == (int)ControlMainProgressBar)
{
ControlMainProgressBar = ControlMainProgressBar+MaxX/20;
Synchronize(ProcessingMainProcessBarUpDate);
}
for (int PosY = 0; PosY < MaxY; PosY++)
{
GetRGB = GetPixel(ProcessBitmapSource->Canvas->Handle,PosX,PosY);
GVR = GetRValue(GetRGB);
GVG = GetGValue(GetRGB);
GVB = GetBValue(GetRGB); // <------------ Hasta aquí se obtienen los valores
//Nuevo Cálculo
SVR = (int)((GVR+GVG+GVB)/3);
SVG = (int)((GVR+GVG+GVB)/3);
SVB = (int)((GVR+GVG+GVB)/3);
//SetRGB(SVR,SVG,SVB); // <------------ Hasta aquí se colocan los valores
SetPixel(
ViosUsForm->GSChild->GraySourceImage->Picture->Bitmap->Canvas->Handle
//ProcessBitmapResult->Canvas->Handle
,PosX,PosY,RGB(SVR,SVG,SVB));
}
}
ViosUsForm->MainProgressBar->Visible = false;
Synchronize(TryProcess);
delete ProcessBitmapResult;
delete ProcessBitmapSource;
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::ColorToGrayEnd()
{
if(Application->Terminated) return;
if(!Terminated)
{
ViosUsForm->ColorToGrayBitmapEnd();
}
}
//---------------------------------------------------------------------------
void TDIProcessing::GrayToProcessBegin()
{
ProcessBitmapSource = new Graphics::TBitmap();
Synchronize(CatchSource);
ProcessBitmapResult = new Graphics::TBitmap();
int MaxY = ProcessBitmapSource->Height;
int MaxX = ProcessBitmapSource->Width;
ProcessBitmapResult->Height = MaxY;
ProcessBitmapResult->Width = MaxX;
MaskForm->SetMaskProgressBar->Position = 0;
MaskForm->SetMaskProgressBar->Max = MaxX;
MaskForm->SetMaskProgressBar->Min = 0;
MaskForm->SetMaskProgressBar->Step = MaxX/20;
float ControlProgressBar = MaxX/20;
for (int PosX = 0; PosX < MaxX; PosX++)
{
if(PosX == (int)ControlProgressBar)
{
ControlProgressBar = ControlProgressBar+MaxX/20;
MaskForm->SetMaskProgressBar->StepIt();
}
for (int PosY = 0; PosY < MaxY; PosY++)
{
w[1] = 0;w[2] = 0;w[3] = 0;
w[4] = 0;w[5] = 0;w[6] = 0;
w[7] = 0;w[8] = 0;w[9] = 0;
if(PosY-1>=0)
{
if(PosX-1>=0)
w[1] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX-1,PosY-1));
w[2] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX,PosY-1));
if(PosX+1<MaxX)
w[3] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX+1,PosY-1));
}
if(PosX-1>=0)
w[4] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX-1,PosY));
w[5] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX,PosY));
if(PosX+1<MaxX)
w[6] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX+1,PosY));
if(PosY+1<MaxY)
{
if(PosX-1>=0)
w[7] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX-1,PosY+1));
w[8] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX,PosY+1));
if(PosX+1<MaxX)
w[9] = GetRValue(GetPixel(ProcessBitmapSource->Canvas->Handle,PosX+1,PosY+1));
}
switch(ProcessType)
{
case 2: //Low Pass
w[0] = (w[1]+w[2]+w[3]+w[4]+w[5]+w[6]+w[7]+w[8]+w[9])/9;
break;
case 3:
w[0] = (-w[1]-w[2]-w[3]-w[4]+8*w[5]-w[6]-w[7]-w[8]-w[9])/9;
w[0] = max(0,w[0]);
w[0] = w[0]*3;
w[0] = min(255,w[0]);
break;
case 4:
w[0] = (-w[1]-w[2]-w[3]-w[4]+11*w[5]-w[6]-w[7]-w[8]-w[9])/9;
w[0] = max(0,w[0]);
w[0] = min(255,w[0]);
break;
case 5: //Median
{
for(int k = 1; k <10; k++)
for(int l = 1; l <10; l++)
if(w[k]>w[l])
{
int aux = w[k];
w[k] = w[l];
w[l] = aux;
}
w[0] = w[5];
}
break;
case 6: // Prewitt
w[0] = (-2*w[1]-w[2]-w[4]+w[6]+w[8]+2*w[9])/9;
w[0] = w[0]*12;
w[0] = max(0,w[0]);
w[0] = min(255,w[0]);
break;
case 7: // Sobel
w[0] = 2*(-w[1]-w[2]-w[4]+w[6]+w[8]+w[9])/9;
w[0] = w[0]*12;
w[0] = max(0,w[0]);
w[0] = min(255,w[0]);
break;
case 8:
break;
case 9:
break;
case 10:
break;
}
SetPixel(ProcessBitmapResult->Canvas->Handle,PosX,PosY,RGB(w[0],w[0],w[0]));
}
}
Synchronize(TryProcess);
delete ProcessBitmapResult;
delete ProcessBitmapSource;
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::GrayToProcessEnd()
{
if(Application->Terminated) return;
if(!Terminated) ViosUsForm->GrayToProcessBitmapEnd();
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::ProcessingMainProcessBarBegin()
{
if(Application->Terminated) return;
if(!Terminated) ViosUsForm->MainProgressBarBegin();
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::ProcessingMainProcessBarUpDate()
{
if(Application->Terminated) return;
if(!Terminated) ViosUsForm->MainProgressBarUpDate();
}
//---------------------------------------------------------------------------
//Crea un mapa de bit para trabajar capturando el del formulario principal
void __fastcall TDIProcessing::CatchSource()
{
if(ProcessType == 1)
{
ProcessBitmapSource->Assign(ViosUsForm->CSChild->ColorSourceImage->Picture->Bitmap);
/*ViosUsForm->GSChild->GraySourceImage->Picture->Bitmap->Height =
GSChild->ClientHeight = GraySourceBitmap->Height;
GSChild->ClientWidth = GraySourceBitmap->Width;*/
//ProcessBitmapSource->Assign(ViosUsForm->ColorSourceBitmap);
}
else
{
ProcessBitmapSource->Assign(ViosUsForm->GraySourceBitmap);
}
}
//---------------------------------------------------------------------------
void __fastcall TDIProcessing::TryProcess()
{
if(ProcessType == 1)
{
ViosUsForm->GraySourceBitmap->Assign(ProcessBitmapResult);
}
else
{
ViosUsForm->GrayResultBitmap->Assign(ProcessBitmapResult);
}
}
//---------------------------------------------------------------------------
|
DISCULPA
Si está muy largo
Saludos... _________________ Please Response to:joseluisbz@bigfoot.com |
|
| Volver arriba |
|
 |
R. Porcar Site Admin

Registrado: 08 Ago 2002Mensajes: 113Ubicación: Castellón (España)
|
Publicado: Lun 03 Feb, 2003 11:45 pm Asunto: |
|
|
Perdona, no he podido contestar antes. (examenes)
He creado un hilo, y a mi si que me entra dentro de lo que seria tu while.
Veo que usas un par de librerias DIProcessing.h y SetMaskDIP.h, y que tienes una variable ProcessType que no la veo inicializada por ahi (imagino q lo haras en el .h).
Has encontrado algo o sigues igual? Si quieres mandarme el proyecto probaria a compilarlo desde aqui, asi rectifico sobre la marcha.
Salu2 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|