PRoblema con threads windows

05/08/2005 - 18:43 por Buho | Informe spam
Saludos:

Tengo un problemita con 5 threads que tengo funcionando en un Servicio
ATL, el asunto es que uso la clase Thread publicada en
http://www.codeproject.com/threads/...x1185195xx
y en el demo funciona perfectamente...o sea hace "paralelamente" el
trabajo de 2 threads ...los crea asi

m_hThread = (unsigned
long*)CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_ou_thread_proc,(Thread*)this,0,&tid);

y en el stop usa WaitForSingleObject(m_hThread,INFINITE); antes de
CloseHandle(m_hThread); cada uno...

El asunto es que en mi servicio hago exactamente lo mismo es decir los
creo uno tras otro y sucede que el primero..que recupera un set de
datos..al entrar en WaitForSingleObject(...) usa todo el proceso del
servicio es decir se queda en dicha linea hasta que termine...

Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Luis Martinez
06/08/2005 - 02:34 | Informe spam
Puedes utilizar WaitForMultipleObjects :)

Luis

SDET/QOS

"Buho" wrote in message
news:
Saludos:

Tengo un problemita con 5 threads que tengo funcionando en un Servicio
ATL, el asunto es que uso la clase Thread publicada en
http://www.codeproject.com/threads/...x1185195xx
y en el demo funciona perfectamente...o sea hace "paralelamente" el
trabajo de 2 threads ...los crea asi

m_hThread = (unsigned
long*)CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)_ou_thread_proc,(Thread*)this,0,&tid);

y en el stop usa WaitForSingleObject(m_hThread,INFINITE); antes de
CloseHandle(m_hThread); cada uno...

El asunto es que en mi servicio hago exactamente lo mismo es decir los
creo uno tras otro y sucede que el primero..que recupera un set de
datos..al entrar en WaitForSingleObject(...) usa todo el proceso del
servicio es decir se queda en dicha linea hasta que termine...

Gracias de antemano

Respuesta Responder a este mensaje
#2 Buho
06/08/2005 - 18:54 | Informe spam
I used but JUST in first loop works after...this get sequential ... :(
This is the code..

if (ThreadLogin->m_hThread == NULL)
ThreadLogin->start();
if( ThreadLocales->m_hThread == NULL)
ThreadLocales->start();
lpT[0] = ThreadLogin;
lpT[1] = ThreadLocales;
HANDLE* phThread = new HANDLE[2];
for (int i=0;i<2;++i)
{
*(phThread+i) = lpT[i]->m_hThread;
if (*(phThread+i) == NULL)
ATLTRACE(_T("Couldn't create thread %d"), i);
}
WaitForMultipleObjects(2,phThread,true,INFINITE);

DWORD nTotalRows = 0, nRows;
for (i=0; i<2; ++i)
{
GetExitCodeThread(*(phThread + i), &nRows);
nTotalRows += nRows;
CloseHandle(*(phThread + i));
}
delete phThread;
if (ThreadLogin->m_hThread != NULL)
ThreadLogin->stop();
if (ThreadLocales->m_hThread != NULL)
ThreadLocales->stop();
Respuesta Responder a este mensaje
#3 Luis Martinez
08/08/2005 - 21:17 | Informe spam
Podrias ser mas especifico??

Gracias
Luis

SDET/QOS
Microsoft

"Buho" wrote in message
news:
I used but JUST in first loop works after...this get sequential ... :(
This is the code..

if (ThreadLogin->m_hThread == NULL)
ThreadLogin->start();
if( ThreadLocales->m_hThread == NULL)
ThreadLocales->start();
lpT[0] = ThreadLogin;
lpT[1] = ThreadLocales;
HANDLE* phThread = new HANDLE[2];
for (int i=0;i<2;++i)
{
*(phThread+i) = lpT[i]->m_hThread;
if (*(phThread+i) == NULL)
ATLTRACE(_T("Couldn't create thread %d"), i);
}
WaitForMultipleObjects(2,phThread,true,INFINITE);

DWORD nTotalRows = 0, nRows;
for (i=0; i<2; ++i)
{
GetExitCodeThread(*(phThread + i), &nRows);
nTotalRows += nRows;
CloseHandle(*(phThread + i));
}
delete phThread;
if (ThreadLogin->m_hThread != NULL)
ThreadLogin->stop();
if (ThreadLocales->m_hThread != NULL)
ThreadLocales->stop();

Respuesta Responder a este mensaje
#4 Buho
08/08/2005 - 22:52 | Informe spam
OK ... Bueno el que hago es un codigo q debe correr sobre dos threads
asincronos creandolos y destruyendolos en un loop, ahora mi codigo
desde el inicio ha cambiado y bueno ahora con tu recomendacion es asi:
while(flag_loop)
{
phThread = new HANDLE[2];
if(phThread[0]==NULL)
phThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Login,
NULL, 0, &idThread);
if(phThread[1]==NULL)
phThread[1] = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)Locales, NULL, 0, &idThread);

WaitForMultipleObjects(2,phThread,true,INFINITE);

GetExitCodeThread(phThread[0], &nRows);
nTotalRows += nRows;
CloseHandle(phThread[0]);
GetExitCodeThread(phThread[1], &nRows);
CloseHandle(phThread[1]);
delete []phThread ;
...
}
/////y el resultado es que cuando entra en el primer loop (me di
cuenta por la secuencia del cursor de debug)..realiza los threads
compartiendo los recursos o como debe ser...pero en el segundo
loop..hace lo q debe de forma secuencial..como si no fueran threads
sino solo funciones normales una despues de otra..

ahora con _beginthread probé y funciona bien pero tengo el problema
del estado es decir ... necesito que solo cree un thread nuevo cuando
haya terminado de recorrer la funcion( login o locales), ya que estas
usan ADO y al entrar mas de un thread a ellas provocan fallos..es decir
el estado de isruning o algo asi es lo q no se como hacer
funcionar..bueno..gracias la atencion a cualquiera de los problemas que
propongo..

salu2
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida