Ir ao conteúdo

_beginthread() esta na lista mas da-me erro:(


Cambalinho

Posts recomendados

Postado

_beginthread (Points.SoundPlay(FileName,FALSE),0,NULL);

Points é 1 class.

mas porque este erro:

"Deleting intermediate files and output files for project 'test - Win32 Debug'.

--------------------Configuration: test - Win32 Debug--------------------

Compiling...

test.cpp

c:\test\test\test.cpp(162) : error C2065: '_beginthread' : undeclared identifier

Error executing cl.exe.

test.exe - 1 error(s), 0 warning(s)"

se esta na lista(quando fazemos ctrl+space), porque este erro?

Postado

Segue um exemplo de criação de thread em Windows:


#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

long int TT1(void);

int
main(void)
{

HANDLE hMyThread[10];
long int threadid, MyThreadID[10];

int i;

for ( i = 0; i < 10; i++ )
{
// Cria uma thread e associa ao array
hMyThread[i] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)TT1, NULL, 0, &MyThreadID[i]);

// Pega o PID
threadid = *(&MyThreadID[i]);

fprintf( stdout, "[%d] threadid: %li\n", i, threadid );

// Define o semaforo
WaitForSingleObject(hMyThread[i], INFINITE);

fprintf( stdout, "[%d] threadid: %li\n", i, threadid );
}

// Aguarda a última thread ser finalizada
WaitForSingleObject(hMyThread[i], INFINITE);

return 0;
}

long int
TT1(void)
{
fprintf( stdout, "In TT1 - Thread Created\n");

fprintf( stdout, "Sleeping for 1 sec\n");
Sleep(1000);
fprintf( stdout, "In TT1 - Sleep finished\n");

return 0;
}

E outro, que mostra como passar parâmetros pra função chamada pela thread:


#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <time.h>

#define THREADS 80

typedef struct
{
int position;
int value;
} ThParam;

long int ThreadFunction(void *);

int main(void)
{

HANDLE hMyThread[THREADS];
long int MyThreadID[THREADS];
ThParam thParam[THREADS];
int i;

for ( i = 0; i < THREADS; i++ )
{
// Define conteudo na estrutura por thread
thParam[i].position = i;
thParam[i].value = i + 50;

// Cria uma thread e associa ao array
hMyThread[i] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)ThreadFunction, &thParam[i], 0, (PDWORD) &MyThreadID[i]);

if (hMyThread[i] == NULL)
return 3;

// Sleep por causa do time(NULL)
Sleep(300);
}

// Aguarda todas as threads finalizarem
WaitForMultipleObjects(THREADS, hMyThread, TRUE, INFINITE);

// Finaliza todos os thread handles
for ( i = 0; i < THREADS; i++ )
CloseHandle(hMyThread[i]);

return 0;
}

long int ThreadFunction(void *thParam)
{
ThParam *param = (ThParam *) thParam;

int randTime = 0;

srand( time(NULL) );

randTime = (( rand()%10 ) * 1000) + 2;
Sleep(randTime);

fprintf( stdout, "[ID: %3d] In ThreadFunction - Sleep with %d seconds finished - Value: %d\n", param->position, randTime / 1000, param->value );

return 0;
}

Postado
Segue um exemplo de criação de thread em Windows:


#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

long int TT1(void);

int
main(void)
{

HANDLE hMyThread[10];
long int threadid, MyThreadID[10];

int i;

for ( i = 0; i < 10; i++ )
{
// Cria uma thread e associa ao array
hMyThread[i] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)TT1, NULL, 0, &MyThreadID[i]);

// Pega o PID
threadid = *(&MyThreadID[i]);

fprintf( stdout, "[%d] threadid: %li\n", i, threadid );

// Define o semaforo
WaitForSingleObject(hMyThread[i], INFINITE);

fprintf( stdout, "[%d] threadid: %li\n", i, threadid );
}

// Aguarda a última thread ser finalizada
WaitForSingleObject(hMyThread[i], INFINITE);

return 0;
}

long int
TT1(void)
{
fprintf( stdout, "In TT1 - Thread Created\n");

fprintf( stdout, "Sleeping for 1 sec\n");
Sleep(1000);
fprintf( stdout, "In TT1 - Sleep finished\n");

return 0;
}

E outro, que mostra como passar parâmetros pra função chamada pela thread:


#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <time.h>

#define THREADS 80

typedef struct
{
int position;
int value;
} ThParam;

long int ThreadFunction(void *);

int main(void)
{

HANDLE hMyThread[THREADS];
long int MyThreadID[THREADS];
ThParam thParam[THREADS];
int i;

for ( i = 0; i < THREADS; i++ )
{
// Define conteudo na estrutura por thread
thParam[i].position = i;
thParam[i].value = i + 50;

// Cria uma thread e associa ao array
hMyThread[i] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)ThreadFunction, &thParam[i], 0, (PDWORD) &MyThreadID[i]);

if (hMyThread[i] == NULL)
return 3;

// Sleep por causa do time(NULL)
Sleep(300);
}

// Aguarda todas as threads finalizarem
WaitForMultipleObjects(THREADS, hMyThread, TRUE, INFINITE);

// Finaliza todos os thread handles
for ( i = 0; i < THREADS; i++ )
CloseHandle(hMyThread[i]);

return 0;
}

long int ThreadFunction(void *thParam)
{
ThParam *param = (ThParam *) thParam;

int randTime = 0;

srand( time(NULL) );

randTime = (( rand()%10 ) * 1000) + 2;
Sleep(randTime);

fprintf( stdout, "[ID: %3d] In ThreadFunction - Sleep with %d seconds finished - Value: %d\n", param->position, randTime / 1000, param->value );

return 0;
}

desculpa, mas a funçao tem 2 argumentos. como o fazes?

Postado
Monte um vetor com os parâmetros.

ja consegui meter a funcionar. em vez de meter os argumentos fiz 1 funçao á parte. obrigado.

	if ((IntersectRect(&rcTemp, &player, &rctPoints[i])) && (sprPoints[i].Visible==TRUE) )
{
HANDLE hMyThread;
hMyThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)TT1, NULL, 0, NULL);
WaitForSingleObject(hMyThread, INFINITE);
sprPoints[i].Visible=FALSE;
intPoints+=10;
}



long int TT1()
{
sprintf(FileName, "%s\\Sounds\\Points.wav",szCurrentDirectory);
Points.SoundPlay (FileName, FALSE);
return 0;
}

a questao que tenho é a seguinte: porque quando chama esta funçao, o programa para por 0,5 a 1 segundo?

para que serve:

WaitForSingleObject(hMyThread, INFINITE);

?

se a retirar, o programa funciona sem essa 'pausa'.

posso a retirar ou faz mesmo parte da CreateThread()?

Postado

Esse é o semáforo. Ele aguarda o sinal da thread.

É utilizado, principalmente, quando threads fazem acessos concorrentes à dados. Isso evita que uma thread altere um valor enqto outra está alterando também.

No seu caso, pode tirar. Não terá problema.

Postado
Esse é o semáforo. Ele aguarda o sinal da thread.

É utilizado, principalmente, quando threads fazem acessos concorrentes à dados. Isso evita que uma thread altere um valor enqto outra está alterando também.

No seu caso, pode tirar. Não terá problema.

mt obrigado por tudo amigo.

tenho mais 2 questoes: é possivel(porque uso 1 loop) que:

HANDLE hMyThread;
hMyThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)TT1, NULL, 0, NULL);

esteja a ser recriado varias vezes(ocupadndo memoria) ou o meu o if(que faz a activaçao se apanhar o diamante) evita esse problema?

Postado

Se você não tratar o momento da criação das threads, depois que inicializa a primeira, o programa retorna pro loop e inicializa a segunda, sem esperar.

Faça um contador para threads inicializadas.

Postado
Se você não tratar o momento da criação das threads, depois que inicializa a primeira, o programa retorna pro loop e inicializa a segunda, sem esperar.

Faça um contador para threads inicializadas.

eu mal aprendi a usar a multitarefa simples. agora 1 contador estou feito hehehe

//test if the player collide with diamonds
for (i=0; i<5; i++)
{

if ((IntersectRect(&rcTemp, &player, &rctPoints[i])) && (sprPoints[i].Visible==TRUE) )
{
HANDLE hMyThread;
hMyThread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)TT1, NULL, 0, NULL);
sprPoints[i].Visible=FALSE;
intPoints+=10;
}
}

penso que neste caso, nao crio assim tantas, mas ve tu amigo

Postado
A quantidade de threads vai muito de sua necessidade e/ou quanto o sistema comporta.

Com essa quantidade, seu programa roda como esperado?

normal.. sem pausas ao usar o som. tenho 5 diamantes e executa 5 vezes(sem ruidos)

Postado

Em relação ao tratamento das threads, você pode manter uma certa quantidade sempre rodando.

Por exemplo, você iniciou 5. Assim que a primeira finalizar, você decrementa o contador, liberando que outra thread possa inicializar.

Para encerrar a aplicação corretamente, deve-se esperar o término de todas as threads, antes de fechar o programa.

Para ficar melhor, troque o "for" por um "if", dentro de um loop permanente.

Postado
Em relação ao tratamento das threads, você pode manter uma certa quantidade sempre rodando.

Por exemplo, você iniciou 5. Assim que a primeira finalizar, você decrementa o contador, liberando que outra thread possa inicializar.

Para encerrar a aplicação corretamente, deve-se esperar o término de todas as threads, antes de fechar o programa.

Para ficar melhor, troque o "for" por um "if", dentro de um loop permanente.

neste caso eu sei que a thread termina sem problemas. porque o som é de 1 ou 2 segundos;)

mt obrigado pela ajuda amigo

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!